我制作了一个使用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个Paintable。我无法理解为什么对象如此之大,以至于需要花费近半秒的时间才能通过服务器发送。
谁能告诉我为什么会这样吗? Arraylist本质上是大型对象,我应该改用Array吗?我知道不是花费很长时间的序列化,因为通过本地主机发送Paintable时,先发送它们,然后以
如果您需要其他任何信息来确定问题,请告诉我。谢谢。
编辑:
方向是下面的枚举,如果这很重要的话。
public enum Direction {
STILL, UP, DOWN, LEFT, RIGHT;
}
编辑2:
我运行了一个ping应用程序以测试对服务器的ping操作,它返回
编辑3:
我也有确定服务器发送Paintables的时间的代码,它需要2ms。我还具有确定从客户端(非常小的Object)读取命令所花的时间的代码,该代码恰好需要200毫秒。然后,客户端需要花费精确的400毫秒从服务器读取Paintable。
编辑4:
通过在客户端套接字和服务器线程中创建的套接字上调用“ socket.setTcpNoDelay(true)”来解决。像60 fps的魅力一样工作!
最佳答案
Paintable
对象太小,不会引起任何其他延迟。这可能是由于您的计算机和所使用的服务器之间的网络延迟引起的。