2016-09-25 70 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()之后没有任何反应,我会认为呼叫被阻止,等待数据包进来。您是否真的运行连接到您的服务器代码的客户端?