Java-通过UDP连接从一台PC向另一台PC发送消息

Java-通过UDP连接从一台PC向另一台PC发送消息,java,networking,udp,Java,Networking,Udp,当我在本地主机上使用客户端和服务器进行测试时,它可以正常工作。但后来我将客户机和服务器拆分到具有不同IP地址的不同机器上,现在在客户机端没有接收到数据包。任何人都可以发现我的代码的问题: 客户: class Csimudp { public static DatagramSocket ds; public static byte buffer[] = new byte[1024]; public static void Myclient() throws Excepti

当我在本地主机上使用客户端和服务器进行测试时,它可以正常工作。但后来我将客户机和服务器拆分到具有不同IP地址的不同机器上,现在在客户机端没有接收到数据包。任何人都可以发现我的代码的问题:

客户:

class Csimudp {
    public static DatagramSocket ds;
    public static byte buffer[] = new byte[1024];

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

    public static void main(String args[]) throws Exception {
        System.out.println("for quitting client press ctrl+c");
        ds = new DatagramSocket(777);
        Myclient();
    }
}
服务器:

class Ssimudp {
    public static DatagramSocket ds;
    public static byte buffer[] = new byte[1024];

    public static void MyServer() throws Exception {
        int pos = 0;
        while (true) {
            int c = System.in.read();
            switch (c) {
            case '~':
                System.out.println("\n Quits");
                return;
            case '\r':
                break;
            case '\n':
                ds.send(new DatagramPacket(buffer, pos, InetAddress
                        .getByName("117.201.5.150"), 777));
                pos = 0;
                break;
            default:
                buffer[pos++] = (byte) c;
            }
        }
    }

    public static void main(String args[]) throws Exception {
        System.out.println("server ready....\n please type here");
        ds = new DatagramSocket(888);
        MyServer();
    }
}

我冒昧地猜测,您的数据包正在被防火墙阻止。首先,我将分别在客户端和服务器的防火墙中打开相应的传出和传入UDP端口

或者,您的服务器可能位于网关后面,您需要为其设置规则以接收任何数据包。例如,大多数ADSL路由器实际上设置为NAT网关

另一个潜在问题是端口选择:

  • 您正在将客户端绑定到特定的本地端口。没有必要这样做-让操作系统自己选择一个空闲端口。这也将消除尝试使用已在使用的端口的可能性

  • 您正在使用[0-1023]范围内的端口。此端口范围通常为知名服务保留—事实上,在大多数类Unix系统(例如Linux)上,如果没有root权限,则无法在该范围内绑定侦听端口。因此,相当多的ISP会在其防火墙中过滤该端口范围,以保护其用户

  • 如果没有关于连接客户机和服务器的网络的更多信息,就很难提供更具体的答案

    PS:无需在循环的每次迭代中重新创建
    InetAddress
    对象-请事先执行一次


    PS.2:通常,在UDP会话中发送第一个数据包的计算机被视为客户机,因为它也是一台没有固定地址的计算机。在这方面,客户端/服务器角色的分配是相反的。因此,在阅读我的上述观点时,您必须颠倒客户机/服务器规范,以便将其应用于您的代码…

    我觉得代码很好,您能从服务器计算机ping到117.201.5.150吗?服务器和客户机是否在同一网络上?如果不是,他们是不是在NAT设备后面?问题可能不是你的代码,而是网络的配置方式。奇怪的是,这是一个公共IP地址。防火墙规则可能会阻止您的UDP通信,您可能希望使用数据包嗅探器进行验证,或者与您的服务器管理员联系。除了他的客户端必须绑定到特定端口之外,所有优点都是因为“服务器”正在启动连接。@Perception:我是不是感到困惑,或者OP是否确实具有相反的服务器/客户端角色?嗯,他没有真正的客户机或服务器。他的设置肯定更像P2P。我看到一段启动连接的代码(或者UDP中的任何连接),我认为是客户端…UDP通信是无连接的。因此,客户机/服务器的角色更具流动性(与TCP网络相比)。