gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:45:55 25 4
gpt4 key购买 nike

所以我有一个 Java 服务器和客户端,数据被很好地发送到服务器并且服务器正在对其进行交互,但是我发现客户端需要很长时间才能响应服务器发送的内容,经过一段时间的观察我发现我的服务器发送给客户端的数据比应该发送的数据长得多。

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

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

玩家列表类

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(此处有很多空格)...行太长,请切换到环绕模式以查看完整内容线...

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

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

最佳答案

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

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

关于java - 为什么这个 Java UDP 数据包长度太长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10899106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com