Java 数据包中没有地址
我试图在一个简单的乒乓球游戏中添加一个多人游戏表单,但是当我尝试启动Java 数据包中没有地址,java,sockets,server,udp,datagram,Java,Sockets,Server,Udp,Datagram,我试图在一个简单的乒乓球游戏中添加一个多人游戏表单,但是当我尝试启动数据包并尝试读取IP和端口时,它会显示IP为空,端口为-1。有人知道为什么会这样吗?我想这可能是因为套接字还没有收到数据包,但是当我查看时,我看到socket.recieve(packet)之后的所有代码都没有运行 启动服务器的代码: public GameServer(PongEngine engine) { this.engine = engine; try { this.socket = n
数据包
并尝试读取IP和端口时,它会显示IP为空
,端口为-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());
}
}
}
再加上罗伯茨的回答,你的代码简直是乱七八糟。一旦你修复了这个问题,你就可以解释为什么你可能没有收到来自另一台电脑的数据包,就像ccarton建议的那样 试试这个,记下这两条评论
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();
}
}
}
现在您仍然会遇到同样的问题吗?的getAddress
返回发送此数据报或从中接收数据报的计算机的IP地址
在第一个System.out.println
中,您刚刚创建了对象,但没有对其进行任何网络I/O
然后忽略异常并尝试处理数据报。如果存在I/O错误,则数据报可能未初始化,因此仍然具有IP地址null
和端口-1
如果在socket.receive()之后什么也没有发生,我会假设调用被阻塞,等待数据包进入。您是否确实运行了连接到服务器代码的客户端?您的第一个想法是正确的。在调用receive函数之前,不会填充IP和端口值。如果该点之后的代码没有执行,那么要么抛出异常,要么根本没有客户端连接。接收将阻塞,直到收到数据包。据我所知,我正在正确运行客户端和服务器。这是我的客户:。你觉得有什么问题吗?