【发布时间】:2015-03-11 13:05:44
【问题描述】:
我不明白为什么我的带有Socket 和ServerSocket 的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