2011-10-22 7 views
2

서버는 에코 서버처럼 작동합니다. 클라이언트가 서버에 10 개의 패킷을 보냅니다. (갭 1 초)데이터 그램 소켓에서 setSotimeout

클라이언트가 서버에서 패킷을 받으면 패킷이 손실되는 경우가 있습니다.

따라서 클라이언트는 패킷이 도착할 때까지 최대 1 초간 기다려야합니다. 패킷이 1 초 내에 도착하지 않으면 클라이언트는 다른 패킷을 계속 보내야합니다.

어떻게 이것을 달성하기 위해 .setSoTimeout을 사용할 수 있습니까?

코드 :

import java.io.*; 
import java.net.*; 
import java.util.*; 
/* 
* Client to process ping requests over UDP. 
*/ 
public class PingClient 
{ 
    private static final int AVERAGE_DELAY = 100; // milliseconds 
    public static void main(String[] args) throws Exception 
    { 
// Get command line argument. 
     int port = Integer.parseInt(args[1]);//specified as argument 
// Create random number generator for use in simulating 
// packet loss and network delay. 
     System.out.println("Port "+port); 
// Create a datagram socket for receiving and sending UDP packets 
// through the port specified on the command line. 
     DatagramSocket socket = new DatagramSocket(1234); 

    int i=0; 
     for(i=0;i<10;i++) 
    { 
    byte[] buf = new byte[1024] ; 
    Calendar cal=Calendar.getInstance(); 
    String ping="Ping "+ i +" "+cal.getTimeInMillis()+"\r\n"; 
    buf=ping.getBytes("UTF-8"); 
    InetAddress address = InetAddress.getByName(args[0]); 
    System.out.println("Name "+args[1]); 
    DatagramPacket packet = new DatagramPacket(buf, buf.length, 
             address, port); 
    packet.setData(buf); 
    socket.send(packet); 
    Thread.sleep(10* AVERAGE_DELAY);//1 sec 

    DatagramPacket server_response = new DatagramPacket(new byte[1024], 1024); 
    // Block until the host receives a UDP packet. 

     socket.setSoTimeout(1000); //I don't know how to use this 
     socket.receive(server_response); 

    // Print the recieved data. 

     printData(server_response); 

} 
} 

private static void printData(DatagramPacket request) throws Exception 
    { 
// Obtain references to the packet's array of bytes. 
    byte[] buf = request.getData(); 
// Wrap the bytes in a byte array input stream, 
// so that you can read the data as a stream of bytes. 
    ByteArrayInputStream bais = new ByteArrayInputStream(buf); 
// Wrap the byte array output stream in an input stream reader, 
// so you can read the data as a stream of characters. 
    InputStreamReader isr = new InputStreamReader(bais); 
// Wrap the input stream reader in a bufferred reader, 
// so you can read the character data a line at a time. 
// (A line is a sequence of chars terminated by any combination of \r and \n.) 
    BufferedReader br = new BufferedReader(isr); 
// The message data is contained in a single line, so read this line. 
    String line = br.readLine(); 
// Print host address and data received from it. 
    System.out.println(
     "Received from " + 
     request.getAddress().getHostAddress() + 
     ": " + 
     new String(line)); 
    } 

}

+1

질문은 무엇을 사용할 수 있나요? –

+0

서버에서 패킷을받지 못한 경우 클라이언트가 패킷을 계속 보내길 원합니다. 클라이언트가 서버에서 패킷을 수신하기 위해 1 초 동안 대기해야합니다. – Wasi

+0

네 질문은 무엇입니까? 제목에 솔루션의 이름을 지정했습니다. BTW 1 초 시간 제한 꽤 관용입니다. 그걸 검토하고 싶을 수도 있습니다. – EJP

답변

11

javadoc for setSoTimeout는 말한다 : 타임 아웃을 제로 이외의 값으로 설정이 옵션을

는, 호출은 이 DatagramSocket 의지에 대한()받을 이 시간 동안 만 차단하십시오. 시간 종료가 만료되면 DatagramSocket이 여전히 유효하지만 java.net.SocketTimeoutException이 발생합니다. 당신이 응답 1 초 이후에 접수되지 않은 경우 패킷을 보내려면

그래서, 당신은

socket.setSoTimeout(1000L); 
boolean continueSending = true; 
int counter = 0; 
while (continueSending && counter < 10) { 
    // send to server omitted 
    counter++; 
    try { 
     socket.receive(packet); 
     continueSending = false; // a packet has been received : stop sending 
    } 
    catch (SocketTimeoutException e) { 
     // no response received after 1 second. continue sending 
    } 
}