2009-06-11 3 views
3

나는 (그루비로 작성) 간단한 심하게 행동 서버자바/그루비 소켓 쓰기 제한 시간

ServerSocket ss = new ServerSocket(8889); 
Socket s = ss.accept() 
Thread.sleep(1000000) 

내가 제한 시간을 갖고 싶어 클라이언트 (서버 때문에 소모되지 않고 그것의 입력)

Socket s = new Socket("192.168.0.106", 8889) 
s.setSoTimeout(100); 
s.getOutputStream.write(new byte[1000000]); 

그러나이 클라이언트는 영원히 차단됩니다. 클라이언트의 시간 초과는 어떻게합니까?

고맙습니다!

답변

3

클라이언트를 자체 스레드에 생성하고 돌아가려면 잠금/대기 (제한 시간이 길어짐) 할 수 있습니다. 가능한 경우 Future 개체를 사용하면 소켓이 성공한 경우 반환 값을 가져올 수 있습니다.

소켓에 대한 SO_TIMEOUT 설정은 쓰기가 아니라 소켓에서의 읽기 (..) 호출에만 영향을 미친다 고 생각합니다.

SocketChannel (Stream이 아니라)을 사용하고 해당 채널을 처리하는 다른 스레드를 생성 할 수 있습니다. 다른 스레드는 특정 시간 초과가 차단 된 후에 해당 채널을 비동기 적으로 닫을 수 있습니다.

1

소켓 시간 초과는 응용 프로그램 수준이 아닌 TCP 수준입니다. 원본 컴퓨터 TCP가 전송할 데이터를 버퍼링하고 대상 컴퓨터 네트워크 스택이 수신 된 데이터를 확인하고 있으므로 시간 제한이 없습니다. 또한, 다른 TCP/IP 구현은 이러한 시간 초과를 다르게 처리합니다. tcpdump (또는 매우 불행한 경우 wireshark 인 경우)에서 진행중인 작업을 살펴보십시오. 필요한 것은 애플리케이션 수준 ACK입니다. 즉, 클라이언트와 서버 사이의 프로토콜을 정의해야합니다. Java 패키지 (아마도 nio을 보길 원할 것입니다)에 대해서는 언급 할 수 없지만 ACK는 대개 poll/select으로 처리됩니다.

0

시간 초과를 얻을 수있는 방법은 없지만 쓰기가 끝나지 않은 경우 항상 연결을 닫는 스레드를 생성 할 수 있습니다.