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

时间:2013-12-10 19:30:30

标签: java performance sockets network-protocols

客户端发送消息。服务器读取消息并写回复。客户端读取回复。重复。每条消息都短于500字节。套接字没有关闭。

我在LAN上的两台台式机之间获得大约800个请求+响应/秒。主机上的网络活动几乎不可察觉。

如果我不做readReply(或在单独的线程中执行),则在整个爆炸期间达到30.000 msg / sec或更高!这也会使主机上的网络活动达到峰值。

我的问题:

  1. 单个套接字上的请求/响应协议的合理数量是800 msg / sec吗?

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

  3. 除了使用UDP之外,可以采取哪些措施来改善这一点?可能使用的任何其他协议?

  4. 服务器:

    while (true) {
       message = readMessage();
       writeReply("Thanks");
    }
    

    客户端:

    while (true) {
       writeMessage("A message");
       reply = readReply();
    }
    

    注意:

    • 我在Java和Php中都实现了这一点并获得了相同的结果。
    • Ping延迟<1 ms

1 个答案:

答案 0 :(得分:0)

基本问题是延迟:网络帧/包到达目的地所需的时间。

例如,1 ms延迟将速度限制为最多1000帧/秒。延迟2 ms可以处理500 fps,10 ms可以处理100 fps等。

  1. 在这种情况下,当延迟为0.5毫秒时,预计会管理1600 fps(800 * 2)。

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

  3. 如果可能,批量(管道)消息。从批处理中发送10条消息,然后等待服务器回复。服务器也应该在一个块中发送所有10个回复。这应该使理论上的速度提高10倍。