java - 如何优化简单的套接字通信?

标签 java performance sockets network-protocols

客户端发送消息。服务器读取消息并写入回复。客户阅读回复。重复。每条消息少于 500 字节。套接字未关闭。

我在 LAN 上的两台台式电脑之间每秒收到大约 800 个请求+响应。主机上的网络 Activity 几乎难以察觉。

如果我不执行 readReply (或在单独的线程中执行),整个过程会爆炸到 30.000 条消息/秒或更多!这也会使主机上的网络 Activity 达到峰值。

我的问题:

  1. 800 条消息/秒对于单个套接字上的请求/响应协议(protocol)来说是一个合理的数字吗?

  2. 删除 readReply 调用如何能够提高性能???

  3. 除了使用 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 等等。

  1. 在本例中,当延迟为 0.5 毫秒时,预计可管理 1600 fps (800*2)。

  2. 我认为这是因为您设法每帧发送更多数据。一段时间后它会填满客户端的 TCP 缓冲区。

  3. 如果可能的话,批量(管道)消息。客户端批量发送10条消息,然后等待服务器回复。服务器也应该在一个 block 中发送所有 10 个回复。理论上这应该会使速度快 10 倍。

关于java - 如何优化简单的套接字通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20503531/

相关文章:

c - 为什么客户端的输出不会打印到屏幕上?

C 通过主机名获取ip

java - Spring Boot 2.5.0、Spring Cloud 2020.0.2 和 Hibernate 5.4.31 - H2 数据库多行插入失败

java - SplitPane 垂直不起作用

Java 泛型 - 类型转换问题

c# - C# 中更快的字符串比较

python - 读取大文件并制作字典

java - 如何从表中获取属性

Javascript:在线测量代码执行时间

sockets - 如何在 TCP 协议(protocol)中找到 "congestion window size"?