2012-03-03 124 views
3

当我使用本地主机上的客户端和服务器测试它的作品时。但是随后我将客户端和服务器拆分为具有不同IP地址的不同机器,现在客户端没有收到数据包。任何人都可以发现这个问题与我的代码:Java - 通过UDP连接将消息从一台PC发送到另一台PC

客户:

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(); 
    } 
} 
+0

代码对我来说很好,您可以从服务器计算机ping到117.201.5.150吗? – roni 2012-03-03 19:19:11

+0

服务器和客户端是否位于同一网络上?如果他们不是,他们在NAT设备后面吗?问题可能不在于您的代码,而是与网络的配置方式有关。 – smessing 2012-03-03 19:21:18

+0

奇数,这是一个公共IP地址。防火墙规则可能会阻止您的UDP通信,您可能需要使用数据包嗅探器进行验证,或与您的服务器管理员联系。 – Perception 2012-03-03 19:22:45

回答

3

我会大胆地猜测被阻止你的数据包通过防火墙的地方在他们的方式。我将首先分别在客户端和服务器的防火墙中打开相应的传出和传入UDP端口。

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

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

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

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

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

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

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

+0

所有的优点,除了他的客户端必须绑定到特定的端口,因为'服务器'正在启动连接。 – Perception 2012-03-03 19:37:11

+0

@Perception:我感到困惑,还是OP真的有相反的服务器/客户端角色? – thkala 2012-03-03 19:40:38

+0

那么,他真的没有客户端*或*服务器。他的设置绝对是更多的P2P。 – Perception 2012-03-03 19:42:59

相关问题