我创建了一个使用ObjectStream与服务器之间发送数据的应用程序。当我连接到localhost时,所有工作都很精彩。但是,当我创建一个实际的服务器时,该过程需要大约500毫秒才能完成。
我认为我的对象太大了。我只发送一个Paintables对象,你可以看到它包含一个Paintable的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;
}
}
然后是Paintable类
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;
}
}
Arraylist中只包含2个Paintables。我无法理解为什么对象太大而需要通过服务器发送几乎半秒钟。
谁能告诉我为什么会这样? Arraylists本质上是大型对象,我应该使用数组吗?我知道序列化不是花费很长时间,因为当通过localhost发送Paintables时,它们被发送然后加载到&lt; 1ms。
如果您需要确定问题,请告知我们。谢谢。
编辑:
方向是以下枚举,如果这很重要的话。
public enum Direction {
STILL, UP, DOWN, LEFT, RIGHT;
}
编辑2:
我运行了一个ping应用来测试ping到服务器,它返回&lt; 1ms,这是有道理的,因为我的计算机正在托管服务器。
编辑3:
我还有代码确定服务器发送Paintables所需的时间,并且需要2ms。我还有一些代码,用于确定从客户端(非常小的对象)读取命令所需的时间,并且需要200毫秒。然后,客户端需要400ms才能从服务器读取Paintables。
编辑4:
通过在客户端套接字和服务器线程中创建的套接字上调用“socket.setTcpNoDelay(true)”来解决此问题。像60 fps的魅力一样工作!
答案 0 :(得分:3)
Paintable
个对象太小而不会导致任何额外的延迟。这可能只是由您的计算机与您使用的服务器之间的网络延迟引起的。
答案 1 :(得分:0)
Java的内置序列化速度相当慢。我通常使用Gson库(https://code.google.com/p/google-gson/)来使用gzip
ed json。
您还可以使用Google的协议缓冲区:https://developers.google.com/protocol-buffers/
答案 2 :(得分:0)
我认为使程序变慢的原因是序列化过程而不是网络。在这种情况下,ArrayList不是一个大对象。如果您正在编写Android应用程序,则可以实现Parcelable接口。它的速度更快。