Java 在数据报套接字上设置otimeout

Java 在数据报套接字上设置otimeout,java,sockets,datagram,socket-timeout-exception,Java,Sockets,Datagram,Socket Timeout Exception,该服务器的作用类似于echo服务器。客户端向服务器发送10个数据包(间隔1秒) 当客户端从服务器接收数据包时,数据包有时会丢失 因此,客户端必须等待长达一秒钟的数据包到达。如果数据包未在1秒内到达,则客户端应继续发送其他数据包 我将如何使用.setSoTimeout来实现这一点 代码: import java.io.*; 导入java.net。*; 导入java.util.*; /* *客户端通过UDP处理ping请求。 */ 公共类PingClient { 私有静态最终整数平均延迟=100;/

该服务器的作用类似于echo服务器。客户端向服务器发送10个数据包(间隔1秒)

当客户端从服务器接收数据包时,数据包有时会丢失

因此,客户端必须等待长达一秒钟的数据包到达。如果数据包未在1秒内到达,则客户端应继续发送其他数据包

我将如何使用.setSoTimeout来实现这一点

代码:
import java.io.*;
导入java.net。*;
导入java.util.*;
/*
*客户端通过UDP处理ping请求。
*/
公共类PingClient
{
私有静态最终整数平均延迟=100;//毫秒
公共静态void main(字符串[]args)引发异常
{
//获取命令行参数。
int port=Integer.parseInt(args[1]);//指定为参数
//创建用于模拟的随机数生成器
//数据包丢失和网络延迟。
系统输出打印项次(“端口”+端口);
//创建用于接收和发送UDP数据包的数据报套接字
//通过命令行上指定的端口。
DatagramSocket套接字=新DatagramSocket(1234);
int i=0;
对于(i=0;i

如果此选项设置为非零超时,则为 此DatagramSocket将仅在这段时间内阻塞。如果 超时过期时,会引发java.net.SocketTimeoutException DatagramSocket仍然有效

因此,如果您想在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
    }
}
socket.setSoTimeout(1000L);
布尔continueSending=true;
int计数器=0;
while(继续发送和计数器<10){
//忽略发送到服务器
计数器++;
试一试{
套接字接收(数据包);
continueSending=false;//已收到数据包:停止发送
}
捕获(SocketTimeoutException e){
//1秒后未收到响应。是否继续发送
}
}

如果没有收到来自服务器的数据包,我希望客户端继续发送数据包。客户端应该等待1秒钟才能从服务器接收数据包。是的,您的问题是什么?您已经在标题中指定了解决方案。顺便说一句,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
    }
}