DatagramPacket

时间:2016-09-25 21:56:09

标签: java sockets server udp datagram

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

2 个答案:

答案 0 :(得分:2)

DatagramPacketgetAddress返回发送此数据报或从中接收数据报的机器的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();
        }
    }
}

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