我有一个到服务器的 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/