【问题标题】:No address in DatagramPacketDatagramPacket 中没有地址
【发布时间】:2016-09-25 21:56:09
【问题描述】:

我正在尝试向一个简单的乒乓球游戏添加多人游戏形式,但是当我尝试启动 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());
        }
    }
}

【问题讨论】:

  • 你的第一个想法是正确的。直到调用接收函数后才会填充 IP 和端口值。如果该点之后的代码没有执行,那么要么抛出异常,要么根本没有客户端连接。接收将阻塞,直到收到数据包。
  • 据我所知,我正在正确运行客户端和服务器。这是我的客户:pastebin.com/2zMdgNVP。有什么问题吗?

标签: java sockets server udp datagram


【解决方案1】:

DatagramPacketgetAddress 返回此数据报发送到或接收数据报的机器的 IP 地址。

在第一个 System.out.println 中,您刚刚创建了对象,但尚未对其进行任何网络 I/O。

然后您忽略异常并尝试使用数据报。如果出现 I/O 错误,很可能是数据报没有初始化,因此仍然有 IP 地址null 和端口-1。

如果在socket.receive() 之后没有任何反应,我会假设调用被阻塞,等待数据包进来。你真的运行连接到服务器代码的客户端吗?

【讨论】:

    【解决方案2】:

    要添加到罗伯茨的答案,您的代码完全是乱序的。一旦你解决了这个问题,你就可以解决为什么你可能没有像 ccarton 建议的那样从其他 PC 收到数据包。

    试试这个,注意两个 cmets

    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();
            }
        }
    }
    

    现在你还遇到同样的问题吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-29
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      相关资源
      最近更新 更多