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

时间:2012-03-03 18:54:29

标签: java networking udp

当我在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();
    }
}

1 个答案:

答案 0 :(得分:3)

我会冒险猜测你的数据包是否被防火墙阻挡了。我首先分别在客户端和服务器的防火墙中打开相应的传出和传入UDP端口。

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

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

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

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

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

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

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