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 초 동안 대기해야합니다. – Wasi
네 질문은 무엇입니까? 제목에 솔루션의 이름을 지정했습니다. BTW 1 초 시간 제한 꽤 관용입니다. 그걸 검토하고 싶을 수도 있습니다. – EJP