Java套接字:比一个换行符快两个换行符

时间:2018-11-20 10:03:30

标签: java networking

我有一个简单的客户端-服务器应用程序。服务器使用Java,客户端使用Python3。服务器等待一个客户端,然后通过以下方式与之进行永久通信。服务器从客户端读取一行,然后将消息“ yyyy”发送回去。因此,从客户端来看,对话可能看起来像这样:

ClientRequest

我遇到的问题是通讯速度。我测量服务器读取客户端请求所花费的时间,大约是40毫秒。但是,最令人惊讶的是,如果客户端在其每条消息后附加一个换行符'\ n',则持续时间将降至〜0ms。造成这种情况的原因是什么?如何解决它,这样我就不必在每个客户的请求中都包含人工换行符?

为完整起见,我还提供了服务器端和客户端代码。

服务器端:

xxxx
> yyyy
xxxx
> yyyy
xxxx
> yyyy
...

客户端:

import java.io.*;
import java.net.*;
import java.time.*;
import java.util.*;

class Server {
  public static void main (String[] args) {
    Clock clock = Clock.systemDefaultZone();
    try {
      ServerSocket server = new ServerSocket();
      server.bind(new InetSocketAddress("127.0.0.1", 4248));
      Socket client = server.accept();

      Scanner sc = new Scanner(client.getInputStream());
      PrintStream ps = new PrintStream(client.getOutputStream());

      while (true) {
        Instant start = clock.instant();
        String msg = sc.nextLine();
        Instant end = clock.instant();
        System.err.format("Took me %d ms to receive the message\n", Duration.between(start, end).getNano() / 1000000);
        ps.println("yyyy");
      }
    }
    catch (IOException exc) {}
  }
}

通过将“ xxxx”替换为“ xxxx \ n”来获得“快速”客户端。请注意,Python3在每条消息之后自动打印换行符,因此前者实际上是“ xxxx \ n”,后者是“ xxxx \ n \ n”。

1 个答案:

答案 0 :(得分:0)

  

我测量服务器读取客户端请求所花费的时间

不仅如此,您还(至少部分地)测量了客户端发送请求的时间。

只是一个猜测

Python客户端是瓶颈,无法跟上Java服务器。服务器的SELECT * FROM ns_98; 4321/4567 43/45 43898/4521 4388/4521 43885/45215 4388///4521 SELECT a FROM ns_98 WHERE REGEXP_LIKE (a,'^[0-9]{4}/{1}[0-9]{4}$'); output: 4321/4567 4388/4521 总是等待客户端打印一些内容。
当您将nextLine()更改为print("xxxx")时,将同时打印两行,这会使客户端的行输出率翻倍。现在是另一回事了:客户端发送消息的速度比服务器处理消息的速度快,并且客户端的print("xxxx\n")必须等待服务器。
请注意,在后一种情况下,消息在readline()"xxxx"之间交替。那可能不是您想要的。但是,您可以使用""

您可以通过编写使用print("xxxx\nxxxx")的Java客户端来验证该理论。假设Java客户端比python客户端快,我希望测量的时间少于40毫秒,但可能会超过0毫秒。