无法使用java Udp获得响应

时间:2015-09-22 14:28:58

标签: java udp

当我使用Udp DatagramSocket DatagramPacket 类时,我无法得到响应。我使用Tcp Socket 测试了相同的服务器并且它正确响应。

public static void main(String[] args) throws IOException {

    DatagramSocket socket = new DatagramSocket(0); // random available port
    System.out.println("port: " + socket.getLocalPort());
    socket.setSoTimeout(3000); // 3 seconds timeout

    DatagramPacket request = new DatagramPacket(new byte[1], 1, InetAddress.getByName("time.nist.gov"),
            13);

    DatagramPacket response=new DatagramPacket(new byte[1024],1024);

    socket.send(request);
    socket.receive(response);

    String daytime = new String(response.getData(), 0, response.getLength(),
            "US-ASCII");
    System.out.println(daytime);

}

1 个答案:

答案 0 :(得分:1)

这不起作用,因为TCP是点对点的,需要有人在另一端阅读。

然而,UDP是火灾和遗忘,(指向多点)所以当你.send(...)数据包的那一刻已经在进行中。您对.receive(...)的调用只是迟到了。

修复你的例子,在主线程中调用.send(...)之前调用.receive(...)的线程。

由于与TCP相同的原因,您的代码也存在问题。它只是起作用,因为发送的单个字节很容易适应堆栈中的缓冲区。因此,要使用TCP打破您的示例,只需使您发送的有效负载足够大。如果没有人在另一端接收,您的发送操作将无限期地阻止(或超时)。