gpt4 book ai didi

java - 数据报套接字上的 setSotimeout

转载 作者:行者123 更新时间:2023-12-02 13:31:41 25 4
gpt4 key购买 nike

该服务器的作用类似于回显服务器。客户端向服务器发送 10 个数据包(间隔 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) );
}

}

最佳答案

javadoc for setSoTimeout说:

With this option set to a non-zero timeout, a call to receive() for this DatagramSocket will block for only this amount of time. If the timeout expires, a java.net.SocketTimeoutException is raised, though the DatagramSocket is still valid.

所以,如果你想在 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
}
}

关于java - 数据报套接字上的 setSotimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7860904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com