-1

我这里有一个 UDP ping 客户端。我不知道我是否做对了,但我认为如果我设置127.0.0.1为 IP 地址它会起作用。但如果我将其设置为例如 Google 的 IP 地址,则不会。我得到一个例外: java.net.SocketTimeoutException: Receive timed out .

import java.io.*;
import java.net.*;
import java.util.*;

public class PingClient {

    private static final int AVERAGE_DELAY = 0;
    public static void main(String[] args) throws Exception    {
        int port = 4997;
        DatagramSocket socket = new DatagramSocket(port);

        for(int i=1;i<=10;i++) {
            byte[] buf = new byte[1024] ;
            Calendar cal=Calendar.getInstance();
            String ping="PING "+ i +" "+cal.getTimeInMillis()+" ms"+"\r\n";
            buf=ping.getBytes("UTF-8");
            InetAddress address = InetAddress.getByName("69.63.176.11");
            DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
            packet.setData(buf);
            socket.send(packet);
            Thread.sleep( 10* AVERAGE_DELAY);
            DatagramPacket server_response = new DatagramPacket(new byte[1024], 1024);
            socket.setSoTimeout(1000);
            socket.receive(server_response);
            printData(server_response);
        }   
    }
}


4

1 回答 1

1

Ping是互联网时代有趣的恐龙。

不幸的是,您没有指定您在哪个平台上。在 Windows 平台上,127.0.0.1(即 localhost 地址)不会通过实际的网络适配器进行路由。Microsoft 已优化 localhost 路由以通过堆栈的不同部分,因此无论网络连接如何,它都可以一直工作。

在基于 Unix 的主机上,您将能够使用网络嗅探器查看进入“lo”或环回接口的数据包。无论互联网连接如何,这些都将起作用。

Ping 是一个非常古老的协议,它使用 ICMP 协议。我相信这实际上是一个向下的层,或者可能与 UDP 位于同一网络层,但它不是 UDP 消息。

正如另一位成员对这个问题所评论的那样 - 如果您发送到的端口上没有任何东西在监听,那么您正在编写的客户端将会失败。

有关“ping”命令的作用的更多信息,请参阅此内容。

编辑以获取更多信息 我想我看到了问题 - 播放客户端中有两个不同的端口号正在端口 4997 上创建套接字,服务器正在端口 8117 上创建套接字。这似乎是不匹配的一部分。

我做了一个快速的谷歌搜索,它可能会为你指明正确的方向。有关更多信息,请参阅本文

我已经很多年没有编写 TCP/UDP 级别的东西了,所以很抱歉我不能提供更多的实质性信息。

于 2013-01-11T12:35:33.273 回答