2012-04-07 4 views
9

데이터를 서버로 보내고 1 분 동안 응답을 기다린 다음 소켓을 닫고 싶습니다.소켓 수신 시간 초과 설정

어떻게 만드시겠습니까?

DatagramPacket sendpack = new ......; 
socket.send(pack); 
DatagramPacket recievepack = new .....; 
//wait 1 minute{ 
socket.recieve(buf); 
//wait 1 minute} 
socket.close(); 
+0

소켓에서 몇 분 또는 데이터를 사용할 수있을 때까지 기다려야합니까? 1 분 정도 기다리고 싶다면 sleep 또는 usleep 함수를 사용하십시오. 이것들은 계속되기 전에 만료 될 것입니다. 데이터를 기다리는 중이라면 select 함수를 살펴 보겠습니다. select 함수를 사용하면 데이터가 도착할 때까지 기다리거나 만료 기한 중 빠른 날짜를 기다릴 수 있습니다. – Glenn

+0

@Glenn 수면은 최대 1 분이 소요될 수 있습니다. 1 초 후에 데이터가 도착하면 어떻게 될까요? 당신은 read timeout이 *에 대한 것이라고 생각합니까? – EJP

답변

19

시도해 볼 수 있습니다. 시나리오에서 필요에 따라 소켓의 시간 초과를 변경하십시오! 이 코드는 메시지를 보내고 타임 아웃에 도달 할 때까지 메시지 수신을 기다립니다!

DatagramSocket s; 

    try { 
     s = new DatagramSocket(); 
     byte[] buf = new byte[1000]; 
     DatagramPacket dp = new DatagramPacket(buf, buf.length); 
     InetAddress hostAddress = InetAddress.getByName("localhost"); 

     String outString = "Say hi";  // message to send 
     buf = outString.getBytes(); 

     DatagramPacket out = new DatagramPacket(buf, buf.length, hostAddress, 9999); 
     s.send(out);  // send to the server 

     s.setSoTimeout(1000); // set the timeout in millisecounds. 

     while(true){  // recieve data until timeout 
      try { 
       s.receive(dp); 
       String rcvd = "rcvd from " + dp.getAddress() + ", " + dp.getPort() + ": "+ new String(dp.getData(), 0, dp.getLength()); 
       System.out.println(rcvd); 
      } 
      catch (SocketTimeoutException e) { 
       // timeout exception. 
       System.out.println("Timeout reached!!! " + e); 
       s.close(); 
      } 
     } 

    } catch (SocketException e1) { 
     // TODO Auto-generated catch block 
     //e1.printStackTrace(); 
     System.out.println("Socket closed " + e1); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

1 초는 읽기 제한 시간에 비해 너무 짧습니다. 이 코드는'break '가 없어서 시간 초과가 발생하자마자'SocketException : socket closed'를 던집니다. 모든'SocketExceptions '이 소켓이 닫히는 것을 의미하지는 않습니다. – EJP

8

당신이 DatagramSocket를 사용하는 경우, 또는 Socket 사용할 수있는 모든 세부 사항에 대한

socket.setSoTimeout(1000); 
//the value is in milliseconds 

, 당신은 DatagramSocket javadoc 또는 Socket javadoc에서 살펴 보았다한다.

+1

'Socket.setSoTimeout'도 존재합니다. – EJP

+0

@ EJP, 감사합니다. 답변을 수정했습니다. – shibli049

1

EJP의 의견을 명확히하기 위해 "missing break"이 SocketException을 일으키는 것을 의미합니다.

String group = "224.0.0.0"; 
int port = 5000; 

MulticastSocket recvSock = new MulticastSocket(port); 
recvSock.joinGroup(InetAddress.getByName(group)); 
recvSock.setSoTimeout(1000); 

while(true) { 
    try { 
     recvSock.receive(in);    
    } catch (SocketTimeoutException e) { 
     break; // Closing here would cause a SocketException 
    } 
} 

// Move the close() outside the try catch bloock 
recvSock.leaveGroup(InetAddress.getByName(group)); 
recvSock.close();