Java DatagramSocket超时但实际上已收到

标签 java socketexception

奇怪的是我使用WireShark测试结果,结果显示我的代码可以成功通过socket发送消息。但即使我从服务器收到消息,我的程序也会抛出 Timeout 异常。
不知道为什么会出现超时问题。

我的代码很简单:

static Timer timer = new Timer();
try {
    DatagramSocket c = new DatagramSocket();

    c.setBroadcast(true);

    byte[] sendData = "messageToServer".getBytes();
    try {
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("255.255.255.255"), 10000);
        c.connect(InetAddress.getByName("255.255.255.255"), 10000);
        c.send(sendPacket);
    } catch(Exception ex) {
        System.out.println(ex.toString());
    }
    timer.schedule(new receiveTask(), 2000);
} catch(Exception ex) {
    System.out.println(ex.toString());
}

我使用计时器来延迟从服务器接收消息。

receiveTask 类如下所示:

public class receiveTask  extends TimerTask {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            DatagramSocket c2 = new DatagramSocket();
            c2.setSoTimeout(10000);
            byte[] recvBuf = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(recvBuf, recvBuf.length);
            String message = "";
            while (true) {
                c2.receive(receivePacket);
                System.out.println("Receive packet from Server");
                message=new String(receivePacket.getData()).trim();
                System.out.println(message);
                System.out.println("Close the connection of server socket");
            }
        } catch(Exception ex) {
            System.out.println(ex.toString());
        }
    }
}

并且 receiveTask 类中抛出 SocketTimeOut 异常。

由于服务器可以向我发送消息(在 WireShark 中测试),因此我认为 fult 不是服务器端的。但是什么会导致超时呢?

为什么服务器返回消息给我,但我在程序中却收不到它?

我的 Java 版本是 7,禁用计算机上的防火墙没有什么区别...

如有任何建议,我们将不胜感激!

编辑:虽然问题不在于socket.close();我删除了代码。

最佳答案

您可以尝试一些方法。

首先,尝试调用timer.schedule(new receiveTask(), 2000);早点让你的receiveTask在发送任何消息之前已准备好接收消息。

其次,移动您的c.close()声明 finally子句,尤其是 while 内的子句receiveTask的循环以确保您的套接字不会过早关闭。所以代码看起来像

DatagramSocket c2 = null;
try{
    c2 = new DatagramSocket();
    c2.setSoTimeout(10000);
    byte[] recvBuf = new byte[1024];
    DatagramPacket receivePacket = new DatagramPacket(recvBuf, recvBuf.length);
    String message = "";
    while(true){            
        c2.receive(receivePacket);
        System.out.println("Receive packet from Server");
        message=new String(receivePacket.getData()).trim();
        System.out.println(message);                
        System.out.println("Close the connection of server socket");
    }
}catch(Exception ex){
    System.out.println(ex.toString());
} finally{
    if(c2 != null)
        c2.close();
}

如果所有其他方法都失败,请尝试 c2.setSoTimeout(0);这将导致 timeout to be set to infinite 。但我有一种感觉,这只是一个掩盖真正问题的黑客行为。

关于Java DatagramSocket超时但实际上已收到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25542892/

相关文章:

java - Cloudfront Signed Cookies 在 java/javascript 中的完整服务器端实现

java - android python 完全集成

c# - 偶发的 TCP 连接失败 (WSAEHOSTUNREACH)

java.net.SocketException : recvfrom failed: EBADF (Bad file descriptor) Android

c# - 结束连接异常

java - 是否可以在服务器上解码从客户端作为字节数组发送的字节?

java - Android SocketException 'Socket is closed' 即使在使用 socket.isClosed() 后也已关闭

java - 无法销毁资源: com. mchange.v2.c3p0.impl.NewPooledConnection@67a781cc

java - Android 如何从 SharedPreference 设置 EditTextPreference 的默认值?

java - Apache 弗林克 : Extract TypeInformation of Tuple