gpt4 book ai didi

java - 从 TCP 套接字读取的最有效方法

转载 作者:行者123 更新时间:2023-12-02 07:02:38 24 4
gpt4 key购买 nike

我有一个到服务器的 TCP 连接,由套接字和流实现。在 session 期间,服务器可以发送任意数量的消息 - 我必须读取并处理所有消息。

我创建了一个线程,无限循环检查和读取数据:

in = socket.getInputStream();
ByteArrayOutputStream baos = null;
byte[] buf = new byte[4096];
while(!isInterrupted()) {
baos = new ByteArrayOutputStream();
for(int s; ( s = in.read(buf)) != -1; ) {
baos.write(buf, 0, s);
if(in.available() <= 0 ) {
readChunk(baos.toByteArray());
}
}
}

但实际上,它效率不高 - 它使 CPU 承受重负载,并且字节以某种方式与之前的答案粘在一起。

解决这种情况的最有效和优雅的方法是什么?

最佳答案

TCP 不是面向消息的,它是面向流的。这意味着如果您发送两条消息 AA 和 BB,则很可能在不同的场合读取值 AABB、A A B B、A ABB、AAB B、AA BB(其中空格表示不同的读取尝试)。

您将需要自己处理消息大小或消息定界符,因此不再需要 in.available()。此外,您的代码将相同的数据至少复制 3 次到不同的缓冲区,并考虑在 socket.getInputStream() 上使用 BufferedInputStream。

关于java - 从 TCP 套接字读取的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17854592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com