【问题标题】:SocketChannel how to deal with cutted UTF-8 chars and lines in ByteBufferSocketChannel 如何处理 ByteBuffer 中截断的 UTF-8 字符和行
【发布时间】:2012-12-09 17:10:10
【问题描述】:

我的系统正在通过 SocketChannel 接收以 0x0D 0x0A 结尾的 UTF-8 行。我像这样在 ByteBuffer 中读取数据:

final ByteBuffer buffer = ByteBuffer.allocate(bufsize);
final int bytesRead = _mySocket.read(buffer);

缓冲区足够大,可以容纳很多行。但是我不能有一个足够大的缓冲区来包含所有行,行是动态处理的。

缓冲区不能包含所有行,因此行可能会被拆分,编码超过一个字节的字符也可能会被拆分。

我想到了一个解决方案:

  1. 通过逐字节分析 ByteBuffer 来处理我可以提取的所有行(我搜索 0x0D 0x0A)
  2. 识别未处理的字节
  3. 将它们存储在临时变量中
  4. 清空字节缓冲区
  5. 将未处理的字节添加到 ByteBuffer
  6. 再次读取 SocketChannel。
  7. 重复此操作,直到找到指示我收到所有行的行。

java 或任何库是否已经提供此功能?

感谢您的任何回答, 米凯尔

【问题讨论】:

  • 0MQ、ActiveMQ、RabbitMQ、Netty 中的哪一个呢?
  • 通过套接字的 BufferedReader.readLine() 怎么样?你真的需要使用 NIO 吗?
  • @EJP 是的,我需要 NIO,因为我的系统处理了许多连接,而且我无法维护与连接一样多的线程。选择器对我来说是一个很棒的功能。

标签: java nio


【解决方案1】:

我建议使用java.util.Scanner,它知道如何处理SocketChannel,它知道如何读取行

    Scanner sc = new Scanner(_mySocket);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多