2016-09-03 4 views
4

서버를 호출하는 Java 소켓이 있습니다. 그러나 어떤 서버에서 어떤 주소로 연결할 수 있는지 알 수는 없으므로 몇 개의 소켓을 여러 스레드에 넣고 하나의 주소로 서버에 연결하려고합니다. 내 프로시 저는 타임 아웃을 기다리지 않고 소켓과 스레드를 제대로 멈추는 방법을 모르는 것입니다.Java에서 블로킹 소켓 중지

코드 :

socket = new Socket(); 
socket.connect(endpoint, timeout); // **Blocking method** 
OutputStream out = socket.getOutputStream(); 
//Write Data here 

가 어떻게 작동을 방해 할 수 있습니까? Thread.stop() 나쁜 스타일을 고려하고 적절하게 작동하지 않습니다. .NET Tcp를 엔드 포인트는 uinsg 부울 플래그를 허용하는 비 차단 pending 방법을 가지고 있지만 내가 서버에 도달 할 수있는 주소

+1

시도 중 thread.interrupt'와 스레드를 중단()'또는 폐쇄 소켓. 둘 다 예외를 throw해야합니다. –

+1

소켓에 시간 초과를 추가 할 수 있습니까? 시간이 초과되면 스레드가 멈추도록하십시오. 'Thread.interrupt' 호출은 권장하지 않습니다. – prasanth

+0

응용 프로그램이 너무 오래 실행되지 않아야하므로 너무 긴 시간 초과를 원하지 않습니다. @prasanth – chr

답변

0

내가 모르는 비슷한 뭔가를 찾을 수 없습니다, 그래서 여러 소켓을 넣어 여러 스레드에서 그들은 하나의 주소에 각각 서버에 도달하려고합니다.

나쁜. 나쁜 결정. 일부 논리 단계를 수행하여 서버의 주소를 판별하십시오. 또는 서버의 IP 주소에 대해 알고있는 것을 수행하십시오.

마지막 희망 일 경우에만이 방법을 사용하십시오.

내 문제는 내가 제한 시간 대기하고 싶지만 방법 소켓과 스레드 제대로을 중지하는 아무 생각이 없다는 것입니다.

시간 초과 옵션은 없습니다. Socket.connect()가 블로킹하고 있습니다. 기다리는 것 외에는 아무것도 할 수 없습니다.

작성한 소켓 객체를 닫기위한 논리적 인 방법이기 때문에 시간 초과가 발생했습니다. 시간 초과가 될 때까지 직접 닫을 수는 없습니다. 결과가 나오면 제한 시간을 줄입니다 (연결을 받아 들여야 함).

어떻게 조작을 중단 할 수 있습니까? 나는 Thread.stop()을 잘못된 스타일로 생각하고 적절하게 작동하지 않는다.

예, Thread.stop() 또는 Thread.interrupt()를 수행하면 안됩니다. 이들은 나쁜 프로그래밍 스타일입니다.

시간 종료가 만료되면 socket에서 close() 작업을 수행하십시오.

클라이언트 소켓에 대한 소켓 시간 초과를 설정해야합니다. 소켓 시간 제한을 설정하는 것이 가장 좋습니다. 시간 제한은 필요에 따라 약 10 초 정도가되어야합니다. 당신은 당신의 코드에서

당신은 읽기 시간 초과

  1. socket.setSoTimeout(timeout);

    를 호출하여 현재 코드에서 제한 시간을 설정하거나 연결 시간 초과
  2. , connect(endpoint,timeout)을 한 적이있다.

시간 제한이 만료되면 소켓이 여전히 유효하지만 java.net.SocketTimeoutException이 발생합니다. 시간 초과는> 0이어야합니다. 시간 초과 0은 무한 시간 초과로 해석됩니다.

코드에서 try-catch-finally를 사용하지 않았을 수 있습니다. 여기가 더 나은 디자인이 될 것입니다.

당신이 연결 시간 제한을하고있는 것처럼

, 그래서 코드를 차단하는 방법을 종료 개정 할 수 아래 그림과 같이 :

try{ 
    socket = new Socket(); 
    socket.connect(endpoint,timeout); // **Blocking method** 
    OutputStream out = socket.getOutputStream(); 
    //Write Data here 
} 
catch(Exception e){ 
    e.printStackTrace(); 
} 
finally{ 
    socket.close(); 
} 
+0

'Socket.setSoTimeout()'은 읽기 타임 아웃을 설정합니다. 'connect (endpoint, timeout)'는 연결 타임 아웃을 일으킨다. 그것들은 똑같은 것이거나 동등하지 않습니다. – EJP

+0

상황은 단지 일련의 주소가 있고 그들을 찾기위한 논리적 인 단계가 없다는 것입니다. – chr

+0

@chr - 그런 경우라면 괜찮습니다. 그러면 연결할 서버의 옵션이 제한적이라는 의미입니다. 그런 다음이 접근 방식을 사용할 수 있습니다. –