데이터를 서버로 보내고 1 분 동안 응답을 기다린 다음 소켓을 닫고 싶습니다.소켓 수신 시간 초과 설정
어떻게 만드시겠습니까?
DatagramPacket sendpack = new ......;
socket.send(pack);
DatagramPacket recievepack = new .....;
//wait 1 minute{
socket.recieve(buf);
//wait 1 minute}
socket.close();
데이터를 서버로 보내고 1 분 동안 응답을 기다린 다음 소켓을 닫고 싶습니다.소켓 수신 시간 초과 설정
어떻게 만드시겠습니까?
DatagramPacket sendpack = new ......;
socket.send(pack);
DatagramPacket recievepack = new .....;
//wait 1 minute{
socket.recieve(buf);
//wait 1 minute}
socket.close();
시도해 볼 수 있습니다. 시나리오에서 필요에 따라 소켓의 시간 초과를 변경하십시오! 이 코드는 메시지를 보내고 타임 아웃에 도달 할 때까지 메시지 수신을 기다립니다!
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();
}
1 초는 읽기 제한 시간에 비해 너무 짧습니다. 이 코드는'break '가 없어서 시간 초과가 발생하자마자'SocketException : socket closed'를 던집니다. 모든'SocketExceptions '이 소켓이 닫히는 것을 의미하지는 않습니다. – EJP
당신이 DatagramSocket를 사용하는 경우, 또는 Socket 사용할 수있는 모든 세부 사항에 대한
socket.setSoTimeout(1000);
//the value is in milliseconds
, 당신은 DatagramSocket javadoc 또는 Socket javadoc에서 살펴 보았다한다.
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();
소켓에서 몇 분 또는 데이터를 사용할 수있을 때까지 기다려야합니까? 1 분 정도 기다리고 싶다면 sleep 또는 usleep 함수를 사용하십시오. 이것들은 계속되기 전에 만료 될 것입니다. 데이터를 기다리는 중이라면 select 함수를 살펴 보겠습니다. select 함수를 사용하면 데이터가 도착할 때까지 기다리거나 만료 기한 중 빠른 날짜를 기다릴 수 있습니다. – Glenn
@Glenn 수면은 최대 1 분이 소요될 수 있습니다. 1 초 후에 데이터가 도착하면 어떻게 될까요? 당신은 read timeout이 *에 대한 것이라고 생각합니까? – EJP