gpt4 book ai didi

Java服务器一遍又一遍地接收相同的数据

转载 作者:行者123 更新时间:2023-12-02 07:30:28 25 4
gpt4 key购买 nike

所以我有一个服务器-客户端组合,它只是应该来回传递自定义对象。我使用 ObjectInputStream 和 ObjectOutpustStream 类来实现此目的。

这是服务器的循环:

while((inputPosition = (Vector2i) objectIn.readObject()) != null) {
Print.log("input line: " + inputPosition.toString());
outputLine = "you moved to " + inputPosition.toString();
out.println(outputLine);
}

其中 inputPosition 是一个 Vector2i,一个仅包含 2 个整数 x 和 y 的简单类。

这是客户端的循环:

while((serverOutput = in.readLine()) != null) {
Print.log("Server says: " + serverOutput);
position = calculatePosition(position, reader);
Print.log("sending over: " + position.toString());
objectOut.writeObject(position);
}

计算位置方法如下所示:

private static Vector2i calculatePosition(Vector2i position, BufferedReader reader) throws IOException {
Print.log("i just got this: " + position.toString());
String entry = reader.readLine().substring(0, 1);
if(entry.equals("w"))
position.y++;
else if(entry.equals("s"))
position.y--;
else if(entry.equals("a"))
position.x--;
else if(entry.equals("d"))
position.x++;

return position;
}

所以这就是发生的事情。我连接到服务器,成功移动一个坐标后,它只是一遍又一遍地卡在同一坐标上:

Server says: Use wasd to move around.
i just got this: 5, 5
w
sending over: 5, 6
Server says: you moved to 5, 6
i just got this: 5, 6
w
sending over: 5, 7
Server says: you moved to 5, 6
i just got this: 5, 7
a
sending over: 4, 7
Server says: you moved to 5, 6
i just got this: 4, 7

您可以在“发送过来”行中看到客户端的 Vector2i 对象是最新的,但我从服务器得到的响应却一遍又一遍地相同。服务器的日志如下所示:

input line: 5, 6
input line: 5, 6
input line: 5, 6

它似乎一遍又一遍地接收相同的数据,但根据我的日志,客户端应该发送新数据。

有人知道我做错了什么吗?

最佳答案

发送一个对象一次后,它会发送对该对象的引用。这意味着

  • 如果您改变对象并再次发送它,您将看不到更改
  • 对象流的内存会不断增长,因为它需要保留对已发送/接收的每个对象的引用。

避免这两个问题的方法是定期调用reset()。图书馆无法为您执行此操作,因为它不知道可以安全地执行哪些操作。

关于Java服务器一遍又一遍地接收相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12987086/

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