【问题标题】:Sending Objects over Java Socket really slow通过 Java Socket 发送对象真的很慢
【发布时间】:2015-03-11 13:05:44
【问题描述】:

我不明白为什么我的带有SocketServerSocket 的Java 服务器在发送对象时会那么慢。这里有一个小 ping 程序来演示我的问题。如果我在同一台机器上同时运行客户端和服务器,一切都很好(

提前致谢


服务器:

public static void main(String[] args) {
    try {
        ServerSocket serverSocket = new ServerSocket(Integer.parseInt(args[0]));
        Socket socket = serverSocket.accept();

        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

        oos.writeObject(System.currentTimeMillis());
        long time = (long)ois.readObject();

        System.out.println(System.currentTimeMillis()-time+" ms");

    } catch (Exception e) {
        System.out.println("Some error occured");
        System.exit(1);
    }
}

客户:

public static void main(String[] args) {
    try {
        Socket socket = new Socket(args[0], Integer.parseInt(args[1]));

        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

        long time = (long)ois.readObject();
        oos.writeObject(time);

    } catch (Exception e) {
        System.out.println("Some error occured");
        System.exit(1);
    }
}

【问题讨论】:

  • 您似乎在比较服务器时间和客户端时间。两台机器之间的时钟不太可能同步到毫秒。尝试重写它以测量往返时间,在同一台机器上使用时钟:启动时钟,向服务器发送 ping,读取响应,停止时钟。此外,flush 写入后的流。如果这没有帮助,您可能想玩弄send and receive buffer sizes,默认值可能不太适合这么小的消息。
  • @Dima 调整发送和接收缓冲区大小也有帮助,谢谢。现在它在 30ms 与 ping over 命令行相同。

标签: java sockets connection server


【解决方案1】:

我浏览了一下网络,发现你不是唯一一个遇到这个问题的人。这个post also describes the same issue

基本上,你应该做的是:

ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

你应该写:

ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));

你会定期写:

oos.flush();//Write after you send data

【讨论】:

  • 谢谢。我会试试看。
【解决方案2】:

我遇到了同样的问题,简单的连接 ping 大约 400 毫秒。尝试在创建套接字后添加此行: socket.setTcpNoDelay(true);

【讨论】:

  • 非常感谢。这将在同一主机上运行的客户端和服务器都减少了大约 40 毫秒的无故延迟,减少到不到 1 毫秒。
猜你喜欢
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 2016-02-23
相关资源
最近更新 更多