通过Socket流发送对象的最有效方法是什么



我制作了一个应用程序,它使用ObjectStream向服务器发送数据和从服务器发送数据。当我连接到localhost时,一切都非常顺利。然而,当我创建一个实际的服务器时,这个过程几乎需要500毫秒才能完成。

我认为我的物体太大了。我只发送了一个Paintables对象,正如你所看到的,它包含Paintable's的ArrayList。

public class Paintables
implements Serializable {
private ArrayList<Paintable> paintables;
public Paintables() {
this.paintables = new ArrayList<>();
}
public Paintables(ArrayList<Paintable> paintables) {
this.paintables = paintables;
}
public final void addPaintable(Paintable paintable) {
this.paintables.add(paintable);
}
public final ArrayList<Paintable> getPaintables() {
return paintables;
}
}

然后是绘画类

public class Paintable
implements Serializable {
private String name;
private String id;
private int xLocation;
private int yLocation;
private double xRatio;
private double yRatio;
private Direction direction;
public Paintable(String name, String id, int xLocation, int yLocation,
double xRatio, double yRatio, Direction direction) {
this.name = name;
this.id = id;
this.xLocation = xLocation;
this.yLocation = yLocation;
this.xRatio = xRatio;
this.yRatio = yRatio;
this.direction = direction;
}
public final String getName() {
return name;
}
public final String getID() {
return id;
}
public final int getXLocation() {
return xLocation;
}
public final int getYLocation() {
return yLocation;
}
public final double getXRatio() {
return xRatio;
}
public final double getYRatio() {
return yRatio;
}
public final Direction getDirection() {
return direction;
}
}

这个数组中只有两幅绘画作品。我无法理解为什么这个对象如此之大,以至于它几乎需要半秒才能通过服务器发送。

有人能告诉我为什么会发生这种事吗?数组列表本质上是大对象吗?我应该使用数组吗?我知道串行化不会花很长时间,因为当通过localhost发送Paintables时,它们被发送,然后加载到<1毫秒。

如果您需要任何其他信息来确定问题,请告诉我。非常感谢。

编辑:

方向是下面的枚举,如果这很重要的话。

public enum Direction {
STILL, UP, DOWN, LEFT, RIGHT;
}

编辑2:

我运行了一个ping应用程序来测试对服务器的ping,它返回<1ms,这是有意义的,因为我的计算机正在托管服务器。

编辑3:

我还有一个代码,决定服务器发送Paintables需要多长时间,需要2毫秒。我还有一段代码可以确定从客户端(非常小的对象)读取命令需要多长时间,而这正好需要200ms。然后,客户端从服务器上读取Paintables正好需要400毫秒。

编辑4:

通过在客户端套接字和服务器线程中创建的套接字上调用"socket.setTcpNoDelay(true)"来解决。在60帧/秒的速度下发挥魅力!

Paintable对象太小,不会导致任何额外的延迟。这可能只是由您的计算机和您正在使用的服务器之间的网络延迟引起的。

Java的内置序列化相当缓慢。我通常使用Gson库使用gziped json(https://code.google.com/p/google-gson/)。

你也可以使用谷歌的协议缓冲区:https://developers.google.com/protocol-buffers/

我认为使程序运行缓慢的是序列化过程,而不是网络。在这种情况下,ArrayList不是一个大对象。如果你正在编程一个android应用程序,你可以实现Parcelable接口。它更快。

相关内容

  • 没有找到相关文章

最新更新