gpt4 book ai didi

Java NIO : When to properly switch between OP_WRITE and OP_READ

转载 作者:行者123 更新时间:2023-11-30 03:22:38 29 4
gpt4 key购买 nike

作为一些背景:

我通过 SocketChannel、SelectionKey...等连接到服务器。在客户端,如果我想向服务器发送一些内容,我只需将数据写入 ByteBuffer 并通过套接字 channel 发送即可。如果所有内容都已写入,我就完成并可以返回到 OP_READ。如果没有全部写入,我会取出剩下的字节,将它们存储在某个“要发送”缓冲区中,并在键上标记 OP_WRITE(替换 OP_READ 使其仅写入是一个好主意吗?)。

因此,下次我调用 selectNow() 时,我假设它将识别 OP_WRITE 并尝试刷新更多数据(我将尝试通过进入另一个包含要写入的数据的写入循环,并重复如果需要,请上一页)。

这让我想到两个问题:

  • 我是否应该将其保留在 OP_WRITE 中,直到所有数据都被刷新?或者我应该更改为 OP_READ 并尝试在其间进行任何读取?

如果写入 channel 已满并且我无法写入,我是否会继续循环直到我可以开始写入内容?如果连接突然被阻塞,我不确定是否应该只写我能写的内容,然后翻转回 OP_READ,尝试读取,然后翻转回 OP_WRITE。根据我的阅读,这似乎不是正确的做事方式(并且可能会导致大量开销不断来回切换?)。

  • 当缓冲区都可能变满时,处理批量数据读写的最佳方法是什么?

读取听起来很容易,因为您只需循环直到数据被消耗,但写入...服务器可能只写入而不读取。这会给你留下相当满的发送缓冲区,并且在 OP_WRITE 上永远循环而不读取会很糟糕。你如何避免这种情况?您是否设置了一个计时器,如果发送缓冲区没有清理干净,您就停止尝试写入并再次开始读取?如果是这样,您是否删除 OP_WRITE 并记住它以备后用?

附带问题:您是否需要 OP_READ 来从网络读取数据?我不确定它是否像 OP_WRITE 一样,您只在特定情况下标记它(以防万一我做错了,因为我 99.9% 的时间都在 OP_READ 上)。

目前,我只是将 key 设置为 OP_READ,然后将其保留在该模式下,等待数据,当且仅当写入无法发送所有数据(write() 值为 0)时才转到 OP_WRITE。

最佳答案

Am I supposed to leave it in OP_WRITE until all the data has been flushed through? Or should I change to OP_READ and attempt any reads in between?

对此有不同的看法。我的观点是,同行应该在发送新请求之前阅读您发送的响应的每个部分,如果他不这样做,他只是行为不端,您不应该通过提前阅读来鼓励这一点。否则你最终会耗尽内存,并且你不应该让客户端对你这样做。当然,这是假设您是请求-响应协议(protocol)中的服务器。其他情况有各自的要求。

If the writing channel is full and I can't write, do I just keep looping until I can start writing stuff through?

不,您需要等待 OP_WRITE 触发。

If the connection suddenly gets choked, I'm unsure if I'm supposed to just write what I can, flip back to OP_READ, attempt to read, then flip back to OP_WRITE. From what I've read, this appears to not be the correct way to do things (and may cause large overhead constantly switching back and forth?).

开销并不大,但在我上面描述的情况下这样做是错误的。

What is the optimal way to handle reading and writing bulk data when the buffers both may become full?

一般来说,当 OP_READ 触发时读取;需要时就写;并使用 OP_WRITE 告诉您出站失速何时自行解除。

Do you even need OP_READ to read from the network?

是的,否则你只会占用CPU。

关于Java NIO : When to properly switch between OP_WRITE and OP_READ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30986061/

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