2016-09-25 30 views
-1

我正在嘗試將多人表單添加到簡單的pong遊戲中,但是當我嘗試啓動DatagramPacket並嘗試讀取IP和端口時,它說ip是null,端口是-1。有誰知道爲什麼會這樣做?我想也許是因爲套接字還沒有收到數據包,但是當我看到我看到socket.recieve(packet)之後的所有代碼都沒有運行。DatagramPacket中沒有地址

代碼,我啓動服務器:

public GameServer(PongEngine engine) { 
    this.engine = engine; 
    try { 
     this.socket = new DatagramSocket(4269); 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } 
} 

public void run() { 
    while(true) { 
     byte[] data = new byte[1024]; 
     DatagramPacket packet = new DatagramPacket(data, data.length); 
     System.out.println(packet.getAddress() + ":" + packet.getPort()); 
     try { 
      socket.receive(packet); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     String message = new String(packet.getData()); 
     if(message.trim().equalsIgnoreCase("ping")) { 
      System.out.println("CLIENT[" + packet.getAddress() + ":" + packet.getPort() + "] > " + message); 
      sendData("pong".getBytes(), packet.getAddress(), packet.getPort()); 
     } 
    } 
} 
+1

你的第一個想法是正確的。直到接收函數被調用之後,纔會填充IP和端口值。如果該點之後的代碼沒有執行,則拋出異常,或者根本沒有客戶端連接。接收將阻塞,直到它獲得一個數據包。 – ccarton

+0

據我所知,我正在正確運行客戶端和服務器。這是我的客戶:http://pastebin.com/2zMdgNVP。你有沒有看到任何問題? – TheGamerPlayz

回答

1

爲了增加羅伯茨回答,你的代碼只是壞了。一旦你解決了這個問題,你就可以解決爲什麼你可能不會接受像ccarton建議的其他PC一樣的數據包。

試試這個,並注意兩點意見

public void run() { 
    while(true) { 
     byte[] data = new byte[1024]; 
     DatagramPacket packet = new DatagramPacket(data, data.length); 

     try { 
      //Wait for packet (The code will not move on until a packet is received or there is an error) 
      System.out.println("Waiting for packet"); 
      socket.receive(packet); 

      //Move your socket/port info after receiving a packet so you don't get null or -1 
      System.out.println("Packet received: "+ packet.getAddress() + ":" + packet.getPort()); 

      //Move your code inside try, rather than after 
      String message = new String(packet.getData()); 
      if(message.trim().equalsIgnoreCase("ping")) { 
       System.out.println("CLIENT[" + packet.getAddress() + ":" + packet.getPort() + "] > " + message); 
       sendData("pong".getBytes(), packet.getAddress(), packet.getPort()); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

現在你仍然得到同樣的問題?

2

DatagramPacketgetAddress返回此數據報發送到的機器的IP地址或從中收到數據報的機器的IP地址。

在第一個System.out.println中,您剛剛創建了該對象,但尚未對其執行任何網絡I/O。

然後你忽略這個異常並試着使用數據報。如果發生I/O錯誤,很可能數據報沒有初始化,因此仍然有IP地址null和端口-1。

如果在socket.receive()之後沒有任何反應,我會認爲呼叫被阻止,等待數據包進來。您是否真的運行連接到您的服務器代碼的客戶端?