3

我有以下问题:

我有一个位于远程机器上的非常简单的 Java 数据报客户端和服务器。并且客户端不会从服务器接收任何东西,除非它更早地向服务器发送了一个数据包(数据包包含什么信息都没有关系)

这是我的客户的样子:

    public static void TheClient() throws Exception { 
        ds = new DatagramSocket(clientPort); 
        while(true) { 
            DatagramPacket p = new DatagramPacket(buffer, buffer.length);   
            ds.receive(p); 
            System.out.println(new String(p.getData(), 0, p.getLength())); 
        } 
    } 

基本上,它所做的只是监听端口 clientPort,然后打印它接收到的任何内容。但是它不起作用。

现在稍微修改一下就可以解决问题了:

public static void TheClient() throws Exception {
    ds = new DatagramSocket(clientPort); 

    //Sending an empty packet
    byte tempBuffer1[] = new byte[10];
    InetAddress address = InetAddress.getByName(SERVER_IP);
    DatagramPacket packet1 = new DatagramPacket(
            tempBuffer1, tempBuffer1.length, address, serverPort);
    ds.send(packet1);

    while(true) { 
        DatagramPacket p = new DatagramPacket(buffer, 
                buffer.length);     
        ds.receive(p); 
        System.out.println(new String(p.getData(), 0, 
                p.getLength())); 
    } 
} 

有谁知道可能导致此问题的原因?虽然解决方法确实解决了问题,但对我来说为什么它最初无法正常工作没有任何意义,因此该解决方案实际上可能无法在所有计算机上工作。

另外,应该注意的是,当客户端和服务器都在同一台机器上时,代码可以正常工作。

4

2 回答 2

1

检查您的 PC 是否使用私有 IP 地址,通常是一个以“10.xxx”或“192.168.xx”开头的地址。如果是这样,最可能的原因是您正在使用基于 NAT 的防火墙,该防火墙共享一个公共地址和多个私有地址。

当您向外发送数据包时,防火墙知道哪个内部地址应该接收返回数据包。但是,当从外部地址启动连接时,它无法知道应该接收流量的内部地址。大多数 SOHO(小型办公室/家庭办公室)路由器将允许您将流量“端口转发”到特定的内部 IP 地址。如果您使用的是 DHCP,您需要为自己分配一个静态 IP 地址,否则您的端口转发可能会在未来某个日期停止工作,因为它会获取不同的 IP 地址。

于 2013-01-23T03:19:33.110 回答
0

这发生在AWS EC2. 客户端的端口未在您的防火墙(安全组)上打开。当您的客户端向服务器发送数据包时,防火墙会在短时间内允许来自服务器的数据。如果防火墙上的客户端端口打开,则客户端可以从服务器接收而不向服务器发送任何内容。

于 2016-03-23T13:10:51.140 回答