gpt4 book ai didi

Java nio部分读取

转载 作者:行者123 更新时间:2023-12-01 23:51:47 24 4
gpt4 key购买 nike

我的目标是从客户端向服务器发送不同类型的消息,并且它将是基于文本的。我不确定的是如何删除这里的部分读取。我必须确保收到完整的消息,仅此而已。

有人有这方面的经验吗?

这是我到目前为止所拥有的:

    private void handleNewClientMessage(SelectionKey key) throws IOException {
SocketChannel sendingChannel = (SocketChannel) key.channel();

ByteBuffer receivingBuffer = ByteBuffer.allocate(2048);
int bytesRead = sendingChannel.read(receivingBuffer);
if (bytesRead > 0) {
receivingBuffer.flip();

byte[] array = new byte[receivingBuffer.limit()];
receivingBuffer.get(array);
String message = new String(array);

System.out.println("Server received " +message);
}
selector.wakeup();
}

但我无法“结束”该消息并确保收到一封完整的消息。

最诚挚的问候,O

最佳答案

除非一次只读取一个字节,否则您永远无法确定不会读取多于一条消息。 (我不建议)。

相反,我会尽可能多地读取 ByteBuffer 中的内容,然后解析它以找到消息的结尾,例如文本换行符。

当您找到行尾时,将其提取并将其转换为字符串并进行处理。重复直到您收到部分消息(或没有留下任何内容)

如果你发现你只有消息的一部分,那么当你有消息时你compact()(如果position() > 0)并尝试read()更多。

这将允许您一次阅读尽可能多的消息,但也可以处理不完整的消息。

注意:您需要保留连接的 ByteBuffer,以便您知道之前读过哪些部分消息。

注意:如果您的消息大于缓冲区大小,则此方法将不起作用。我建议使用回收的直接 ByteBuffer(例如 1+ MB)。对于直接 ByteBuffer,只有使用的 ByteBuffer 页面才会分配到实际内存。

如果您担心性能,我会尽可能重复使用您的byte[]。仅当您需要比已有空间更多的空间时,才需要重新分配它。

顺便说一句,您可能会发现使用带有 Plain IO 的 BufferedReader 更简单,但性能仍然足够好。

关于Java nio部分读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16217579/

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