Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-Socket.writeObject()非常慢_Java_Performance_Sockets_Multiplayer - Fatal编程技术网

Java-Socket.writeObject()非常慢

Java-Socket.writeObject()非常慢,java,performance,sockets,multiplayer,Java,Performance,Sockets,Multiplayer,您好,我想告诉您,我为我的游戏制作了多人游戏,它可以工作,但从欧洲的一方到另一方,需要8秒。发送的内容不多,它只发送一个具有float x、float y和字符串username的对象 在服务器中,我有3个线程:接受、发送、接收。客户端具有发送和接收功能 服务器发送的一部分: oos = new ObjectOutputStream(new BufferedOutputStream(list_sockets.get(i).getOutputStream())); int client_state

您好,我想告诉您,我为我的游戏制作了多人游戏,它可以工作,但从欧洲的一方到另一方,需要8秒。发送的内容不多,它只发送一个具有float x、float y和字符串username的对象

在服务器中,我有3个线程:接受、发送、接收。客户端具有发送和接收功能

服务器发送的一部分:

oos = new ObjectOutputStream(new BufferedOutputStream(list_sockets.get(i).getOutputStream()));
int client_state = list_client_states.get(i);
oos.writeObject(client_state);
oos.flush();

oos = new ObjectOutputStream(new BufferedOutputStream(list_sockets.get(i).getOutputStream()));
oos.writeObject(list_data);
oos.flush();
这与客户端类似,以下是服务器的接收与播放器类似:

ois = new ObjectInputStream(list_sockets.get(i).getInputStream());
int receive_state = (Integer)ois.readObject();

ois = new ObjectInputStream(list_sockets.get(i).getInputStream());
DataPackage dp = (DataPackage) ois.readObject();

list_data.set(i,dp);

对于发送一个只包含2个浮点数和一个字符串的对象,如何进行序列化/反序列化并没有多大区别。当然,它不会直接导致8秒的延迟。序列化格式的影响可能是几毫秒或更短,除非您使用的网络链接的比特率非常低


我怀疑真正的问题要么是网络问题,要么可能是代码中的某种同步错误,您没有向我们展示。

对于发送仅由2个浮点数和一个字符串组成的对象,如何进行序列化/反序列化并没有多大区别。当然,它不会直接导致8秒的延迟。序列化格式的影响可能是几毫秒或更短,除非您使用的网络链接的比特率非常低


我怀疑真正的问题要么是网络问题,要么可能是代码中的某种同步错误,而您没有向我们展示。

最好使用时间戳来调试代码中占用太多时间的地方

long time=new Date().getTime();
System.out.prrintlnTme戳记+时间/1000


通过这种方式,您可以调试串行化或建立连接所需的时间。

更好的是,您可以使用时间戳来调试代码占用太多时间的地方

long time=new Date().getTime();
System.out.prrintlnTme戳记+时间/1000


通过这种方式,您可以调试串行化或建立连接所需的时间。

这是一段很长的时间。你做过网络诊断吗?从服务器到这个远程客户端的ping时间是多少。你可能想使用更紧凑的通信格式,比如or。好吧,我会看看,我没有做任何ping操作,现在我会看到protobuf和KyroThats很长一段时间。你做过网络诊断吗?从服务器到这个远程客户端的ping时间是多少。你可能想使用更紧凑的通信格式,比如或。好吧,我会看到,我没有做任何ping操作,现在我会看到protobuf和KyroHmm,同步。实际上我从来没有想过,所以我不知道该怎么做。我只是在一个线程守护进程线程中有一个whiletrue循环,我想它叫做whiletrue循环,循环通过所有连接的玩家,所以它不会发送给未连接的玩家,类似的会发送到客户端。PS:我不知道我是如何进行序列化的,我对多人游戏还是新手,但我在我发送的对象类中实现了它,现在我已经在线阅读了writeObject会自动将其序列化。我想,我不知道我的同花顺是不是在一个好地方。嗯,同步。实际上我从来没有想过,所以我不知道该怎么做。我只是在一个线程守护进程线程中有一个whiletrue循环,我想它叫做whiletrue循环,循环通过所有连接的玩家,所以它不会发送给未连接的玩家,类似的会发送到客户端。PS:我不知道我是如何进行序列化的,我对多人游戏还是新手,但我在我发送的对象类中实现了它,现在我已经在线阅读了writeObject会自动将其序列化。我想,我不知道我的脸红是不是在一个好地方。