我制作了一个使用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对象太小,不会引起任何其他延迟。这可能是由于您的计算机和所使用的服务器之间的网络延迟引起的。

10-04 23:45