2012-12-14 4 views
1

클라이언트 - 서버 프로그램을 구현 중이며 서버에서 ACK-Answer없이 5 초 동안 기다린 후에 내 클라이언트가 동일한 패킷을 다시 보내길 원합니다 ...방법을 알고?

나는 이렇게 만들었으므로 괜찮아 경우

dp = new DatagramPacket(packet , packet.length , host , port); 
     sock.send(dp); 
     time = System.currentTimeMillis(); 
     while ((System.currentTimeMillis() - time < 5000) && ack_dp.getLength() == 0) { 
      sock.receive(ack_dp); 
     } 

     if (ack_dp.getLength() == 0) 
      sock.send(dp); 

그래서 내 프로그램은 ACK 5 초를 기다립니다 그가 아무것도받을 나던 경우, 그는 동일한 패킷을 재전송합니다 .. 말해. 그는 패킷 길이하지 ACK를받은 경우 또는 I는 0을 유지 있다면, 그가받은 었소 아무것도 .. 그 다음 동안 시퀀스에서, 더 이상 0이 아닌 것입니다 경우 (.. 새로운 패킷을 보내 .. 확인 PS : 소켓이 비 블로킹으로 설정 한 경우에도 ack_dp는 2 바이트)의 기본 블록으로, 그래서 당신의 루프가 여기에 이해가되지 않는 것이다 소켓

답변

3

receive()이다 (그것은 TM이 busy- 나쁜 생각입니다 케이스의 99.99 %에서 기다리십시오).

사용 setSoTimeout(), 대신 캐치 SocketTimeoutException. 너무 UDP 소켓의 경우

+0

입니까? 그들이 .. – ZelelB

+1

예, 블록을 아무것도받지 못한 경우 UDP가 '블록 소켓을 받으면 나는이 시점의 확실하지 않았다. 자세한 설명서를 읽으십시오 - http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html#receive(java.net.DatagramPacket) –

+0

및 어떻게 확인할 수 있습니까? 패킷이 비어 있습니까? 그것은 packet_name.getLength()로 괜찮습니까? – ZelelB

관련 문제