客户端发送消息。服务器读取消息并写入回复。客户阅读回复。重复。每条消息少于 500 字节。套接字未关闭。
我在 LAN 上的两台台式电脑之间每秒收到大约 800 个请求+响应。主机上的网络 Activity 几乎难以察觉。
如果我不执行 readReply
(或在单独的线程中执行),整个过程会爆炸到 30.000 条消息/秒或更多!这也会使主机上的网络 Activity 达到峰值。
我的问题:
800 条消息/秒对于单个套接字上的请求/响应协议(protocol)来说是一个合理的数字吗?
删除 readReply 调用如何能够提高性能???
除了使用 UDP 之外,还可以采取哪些措施来改进这一点?还可以使用其他协议(protocol)吗?
服务器:
while (true) {
message = readMessage();
writeReply("Thanks");
}
客户:
while (true) {
writeMessage("A message");
reply = readReply();
}
注释:
- 我在 Java 和 Php 中实现了这一点,并得到了大致相同的结果。
- Ping 延迟为 <1 毫秒
最佳答案
基本问题是延迟:网络帧/数据包到达目的地所需的时间。
例如,1 毫秒的延迟将速度限制为最多 1000 帧/秒。 2 毫秒的延迟可以处理 500 fps,10 毫秒可以处理 100 fps 等等。
在本例中,当延迟为 0.5 毫秒时,预计可管理 1600 fps (800*2)。
我认为这是因为您设法每帧发送更多数据。一段时间后它会填满客户端的 TCP 缓冲区。
如果可能的话,批量(管道)消息。客户端批量发送10条消息,然后等待服务器回复。服务器也应该在一个 block 中发送所有 10 个回复。理论上这应该会使速度快 10 倍。
关于java - 如何优化简单的套接字通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20503531/