JavaNIO:何时在操作单元写入和操作单元读取之间正确切换
作为一些背景: 我通过SocketChannel、SelectionKey等连接到服务器。在客户端,如果我想向服务器发送数据,我只需将数据写入ByteBuffer并通过套接字通道发送。如果所有这些都写了,我就完成了,可以返回OP_READ。如果不是全部写入,我会将剩余的字节存储在“to send”缓冲区的某个位置,并在键上标记OP_WRITE(将OP_READ替换为其唯一写入是否是个好主意?) 因此,下次调用selectNow()时,我假设它将识别OP_WRITE并尝试刷新更多数据(我将尝试使用要写入的数据进入另一个写入循环,并在需要时重复前面的操作) 这就引出了两个问题:JavaNIO:何时在操作单元写入和操作单元读取之间正确切换,java,sockets,nio,Java,Sockets,Nio,作为一些背景: 我通过SocketChannel、SelectionKey等连接到服务器。在客户端,如果我想向服务器发送数据,我只需将数据写入ByteBuffer并通过套接字通道发送。如果所有这些都写了,我就完成了,可以返回OP_READ。如果不是全部写入,我会将剩余的字节存储在“to send”缓冲区的某个位置,并在键上标记OP_WRITE(将OP_READ替换为其唯一写入是否是个好主意?) 因此,下次调用selectNow()时,我假设它将识别OP_WRITE并尝试刷新更多数据(我将尝试使用
- 我应该把它留在OP_WRITE中,直到所有数据都被刷新为止吗?或者我应该改为OP_READ并尝试其间的任何读取
- 当缓冲区都已满时,处理读写批量数据的最佳方法是什么
是的,否则您只需抽CPU。每当您需要写入时,只需将感兴趣的操作设置为(OP_READ | OP_write)。完成编写后,只需将感兴趣的操作设置为OP_READ
这就是你要做的 我想我想看一些(简化的)代码。你提到了OP_WRITE和
selectNow()
,但没有提到Selector
,只是提到了SocketCannel
,所以我真的有点搞不懂你到底在做什么。@markspace怎么搞不懂?如果没有选择器,您将如何调用selectNow()
?我的一些东西甚至不需要代码就可以回答,因为后半部分完全是概念性的。即使有代码,使用选择器也足够复杂。只有一个英文描述,我无法猜测到底发生了什么。如果其他人想猜,就把自己弄晕,但我不知道你到底想做什么/有问题。@markspace这很清楚。你不需要设置OP_WRITE“当你需要写的时候”。当您需要知道何时可以写入时,在写入返回零之后,以及在其他任何时间,都需要设置它。