我正在尝试将多人游戏形式添加到一个简单的乒乓球游戏中,但是当我尝试启动DatagramPacket
并尝试读取IP和端口时,它说ip是null
和端口是-1
。有谁知道为什么会这样做?我想也许是因为套接字尚未接收到数据包,但是当我看到时,我看到socket.recieve(packet)
之后的所有代码都没有运行。
启动服务器的代码:
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());
}
}
}
答案 0 :(得分:2)
DatagramPacket的getAddress
返回发送此数据报或从中接收数据报的机器的IP地址。
在第一个System.out.println
中,您刚刚创建了该对象,但尚未使用它进行任何网络I / O.
然后您忽略该异常并尝试使用数据报。如果存在I / O错误,则可能是数据报未初始化,因此仍具有IP地址null
和端口-1。
如果在socket.receive()
之后没有任何反应我会假设呼叫被阻止,等待数据包进入。你真的运行连接到服务器代码的客户端吗?
答案 1 :(得分:1)
要添加到Roberts答案,您的代码完全无序。一旦你修复了那么你可以解决为什么你可能不会像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();
}
}
}
现在你仍然遇到同样的问题吗?