2012-03-03 77 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

相關問題