通过 Java 套接字发送对象真的很慢
Sending Objects over Java Socket really slow
我不明白为什么我的 Java 服务器 Socket
和 ServerSocket
在发送对象时这么慢。这里有一个小的 ping 程序来演示我的问题。如果我 运行 客户端和服务器都在同一台机器上,一切都很好(<1ms ping 时间)。但是,如果我将服务器移动到 Linux 机器上,我会得到 >500 毫秒的 ping 时间(通过命令行 ping 到那台机器说 20 毫秒)。
提前致谢
服务器:
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);
}
}
我在网上看了看,你不是唯一遇到这个问题的人。这个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
我有同样的问题,简单的连接有大约 400 毫秒的 ping。尝试在套接字创建后添加此行:
socket.setTcpNoDelay(true);
我不明白为什么我的 Java 服务器 Socket
和 ServerSocket
在发送对象时这么慢。这里有一个小的 ping 程序来演示我的问题。如果我 运行 客户端和服务器都在同一台机器上,一切都很好(<1ms ping 时间)。但是,如果我将服务器移动到 Linux 机器上,我会得到 >500 毫秒的 ping 时间(通过命令行 ping 到那台机器说 20 毫秒)。
提前致谢
服务器:
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);
}
}
我在网上看了看,你不是唯一遇到这个问题的人。这个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
我有同样的问题,简单的连接有大约 400 毫秒的 ping。尝试在套接字创建后添加此行:
socket.setTcpNoDelay(true);