一次又一次地接收相同数据的Java服务器
所以我有一个服务器-客户机组合,它应该只是来回传递一个自定义对象。我正在使用ObjectInputStream和ObjectOutpustStream类来实现这一点 以下是服务器的循环:一次又一次地接收相同数据的Java服务器,java,sockets,Java,Sockets,所以我有一个服务器-客户机组合,它应该只是来回传递一个自定义对象。我正在使用ObjectInputStream和ObjectOutpustStream类来实现这一点 以下是服务器的循环: while((inputPosition = (Vector2i) objectIn.readObject()) != null) { Print.log("input line: " + inputPosition.toString()); outputLine = "you moved to
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;
}
input line: 5, 6
input line: 5, 6
input line: 5, 6
下面是发生的情况。我连接到服务器,成功移动一个坐标后,它只是一次又一次地卡在同一个坐标上:
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
您可以在“sending over”行中看到,客户端上的vector2i对象是最新的,但我从服务器得到的响应却一次又一次地相同。服务器的日志如下所示:
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;
}
input line: 5, 6
input line: 5, 6
input line: 5, 6
它似乎一次又一次地接收相同的数据,但根据我的日志,客户机应该会发送新数据
有人知道我做错了什么吗?在您发送一次对象后,它会发送对该对象的引用。这意味着
- 如果对对象进行变异并再次发送,则不会看到更改
- 对象流的内存将不断增长,因为它需要保留对已发送/接收的每个对象的引用
避免这两个问题的方法是定期调用
reset()
。图书馆不能为您这样做,因为它不知道什么是安全的。哦,是的。。。只要在循环末尾添加objectOut.reset()就可以解决问题。谢谢