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

标签 java networking udp

当我在本地主机上对客户端和服务器进行测试时,它的工作原理。但是后来我将客户端和服务器拆分到具有不同 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 端口。

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

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

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

  2. 您正在使用 [0-1023] 范围内的端口。这个端口范围通常是为众所周知的服务保留的——事实上,在大多数类 Unix 系统(例如 Linux)上,如果没有 root 权限,你不能在该范围内绑定(bind)一个监听端口。因此,不少 ISP 会在他们的防火墙中过滤该端口范围,据称是为了保护他们的用户。

如果没有有关将客户端连接到服务器的网络的更多信息,则很难提供更具体的答案。

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

PS.2:一般而言,在 UDP session 中发送第一个数据包的计算机被视为客户端,因为它也是可以在没有固定地址的情况下存在的计算机。在这方面,您对客户端/服务器角色的分配是相反的。因此,当阅读我上面的观点时,您将不得不颠倒客户端/服务器规范,以便它们适用于您的代码...

关于Java - 通过UDP连接从一台PC发送消息到另一台PC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9548901/

相关文章:

networking - 为什么 10.0.64.0/24 与 10.0.66.0/18 重叠?

java - 通过网络进行对象反序列化

c - SO_REUSEADDR 的用例是什么?

ios - 如何向大量iPhone发送少量数据

java - 在 JTextField 或 Jbutton 中显示按键计数

java - InetAddress.toString() 返回正斜杠

java - 在 Kindle KDK 中设计 UI(扩展 java.awt)

java - 在 Java 中,如何编写一个套接字服务器来生成一个新进程来处理请求?

linux - Vagrant ssh 和私有(private)网络坏了

TCP/IP 数据包和数据报