【问题标题】:Java - sending message from one PC to another via UDP connectionJava - 通过 UDP 连接从一台 PC 向另一台 PC 发送消息
【发布时间】:2012-03-03 18:54:28
【问题描述】:

当我在 localhost 上使用客户端和服务器进行测试时,它的工作原理。但是后来我将客户端和服务器拆分到具有不同 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();
    }
}

【问题讨论】:

  • 代码对我来说看起来不错,你能从服务器机器 ping 到 117.201.5.150 吗?
  • 服务器和客户端是否在同一个网络上?如果不是,它们是否位于 NAT 设备后面?问题可能不在于您的代码,而在于网络的配置方式。
  • 奇怪,这是一个公共 IP 地址。防火墙规则可能会阻止您的 UDP 通信,您可能需要使用数据包嗅探器进行验证,或联系您的服务器管理员。

标签: java networking udp


【解决方案1】:

我会冒险猜测您的数据包被防火墙阻止了。我首先在客户端和服务器的防火墙中分别打开适当的传出和传入 UDP 端口。

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

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

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

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

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

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

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

【讨论】:

  • 所有优点,除了他的客户端必须绑定到特定端口,因为“服务器”正在启动连接。
  • @Perception:我是不是很困惑,还是 OP 真的有相反的服务器/客户端角色?
  • 好吧,他并没有真正的客户端服务器。他的设置肯定是更多的 P2P。
  • 我看到一段代码启动连接(或任何通过 UDP 连接的代码),我以为是客户端...
  • UDP 通信是无连接的。因此客户端/服务器的角色更加灵活(比 TCP 网络)。
猜你喜欢
  • 2011-10-18
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 2011-05-18
相关资源
最近更新 更多