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

标签 java sockets java-io

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

相关文章:

java - FirebaseAuth.getInstance().signOut() 不注销

Java 7 NIO/JPathWatch 问题 - 在 Windows 中移动目录

c - 套接字读取在返回前获取所有数据

java - Java中计算文件行数

java - 从具有访问限制的共享位置读取文件 (java)

Java 扫描文本文件

java - 如何删除 spring-data-jpa 中多边的项目?

java - JMeter无法识别的命令-genkeypair

.net - 在 .NET 中检测客户端断开连接的最佳实践?

javascript - 将图像缓冲区发送到 node.js tcp 服务器