我有一个简单的客户端-服务器应用程序。服务器使用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”。
答案 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毫秒。