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和端口值。如果该点之后的代码没有执行,那么要么抛出异常,要么根本没有客户端连接。接收将阻塞,直到收到数据包。据我所知,我正在正确运行客户端和服务器。这是我的客户:。你觉得有什么问题吗?