我可以ping我的本地主机,但我不能与其他IP地址

时间:2013-01-11 12:28:11

标签: java udp ping

我这里有一个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);
        }   
    }
}


1 个答案:

答案 0 :(得分:1)

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

很遗憾,您没有指定您所在的平台。在Windows平台上,127.0.0.1(本地主机地址)不会通过实际的网络适配器进行路由。 Microsoft已优化localhost路由以遍历堆栈的不同部分,因此无论网络连接如何,它都将一直有效。

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

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

正如另一位成员对这个问题发表了评论 - 如果您正在发送的端口上没有任何内容,那么您正在编写的客户端将会失败。

有关'ping'命令的详细信息,请参阅this

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

我做了一个快速的谷歌搜索,可能会指出你正确的方向。有关详细信息,请参阅this article

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