为什么这个Java UDP数据包长度太长?

时间:2012-06-05 14:21:48

标签: java udp client packet

所以我有一个java服务器和客户端,数据被正常发送到服务器并且服务器正在进行操作,但我发现客户端需要很长时间才能响应服务器发送的内容,经过一段时间的查找我发现我的服务器发送客户端的数据比应该发送的数据要长。

发送到客户端的数据包包含我发送的所有数据,但它之后还有很多空格,我想解决这个问题,有人有什么想法吗?

我获取数据的代码是服务器上每个客户端的简单for循环,这会将客户端数据添加到字符串中,并将该字符串添加到数据包中:

类PlayerList

public static String getString()
{
    String message = "";

    for(int x = 0; x < list.size(); x++)
    {
        Player player = list.get(x);

        if(message.equals(""))
        {
            message += player.name+";"+player.address+";"+player.pos[0]+";"+player.pos[1]+";"+player.fakeRotation+";"+player.rotation+";"+player.rotationSpeed+";"+player.speed+";"+player.sheildEnabled+";"+player.sheildStrength+";"+player.health;
        }
        else
        {
            message += ","+player.name+";"+player.address+";"+player.pos[0]+";"+player.pos[1]+";"+player.fakeRotation+";"+player.rotation+";"+player.rotationSpeed+";"+player.speed+";"+player.sheildEnabled+";"+player.sheildStrength+";"+player.health;
        }
    }

    System.out.println(message);

    return message;
}

班级发送

while(Server.serverRunning)
    {
        for(int p = 0; p < PlayerList.list.size(); p++)
        {
            Player player = PlayerList.list.get(p);

            try
            {
                byte[] buf = PlayerList.getString().getBytes();

                //send the message to the client to the given address and port
                packet = new DatagramPacket(buf, buf.length, player.address);
                Server.socket.send(packet);
            }
            catch (IOException e)
            {
                System.out.println("Can't send packet to player: "+player.name);
            }
        }
    }

我知道从getString方法收到的数据是正确的,并且没有测试它的空格,所以当我将字符串添加到数据包时必须发生这种情况。

预期数据显示在输出中:     Luke;127.0.0.1:63090;50.0;50.0;0.0;0.0;0.0;0.0;true;100;100

然而,实际数据显示在客户端上:     Luke;127.0.0.1:63090;50.0;50.0;0.0;0.0;0.0;0.0;true;100;100 (lots of spaces here) ...line is too long, please switch to wrapped mode to see whole line...

接收数据的客户端代码是:

receiveData = new byte[clientSocket.getReceiveBufferSize()];
                receivePacket = new DatagramPacket(receiveData, receiveData.length);
                clientSocket.receive(receivePacket);
                receiveMessage = new String(receivePacket.getData());

1 个答案:

答案 0 :(得分:4)

DataSetPacket上的

getData返回整个缓冲区,最后可能有额外的数据。您需要调用getLength()来确定接收到的数据的实际长度,并且只查看来自getData()的那些字节

byte[] realData = Arrays.copyOf( receivePacket.getData(), receivePacket.getLength() );