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

时间:2013-12-23 22:29:53

标签: java serialization stream

我创建了一个使用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的魅力一样工作!

3 个答案:

答案 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接口。它的速度更快。