当前位置: 首页 > 知识库问答 >
问题:

Java NIO:何时正确切换OP_WRITE和OP_READ

邓鸿雪
2023-03-14

作为一些背景:

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

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

如果写入通道已经满了,我不能写了,我是不是一直循环直到我可以开始写东西?如果连接突然阻塞,我不确定是否应该只写我能写的,翻转回OP_READ,尝试读取,然后翻转回op_write。从我读到的内容来看,这似乎不是一种正确的做事方式(并且可能会导致大量的开销不断地来回切换?)。

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

共有1个答案

况景龙
2023-03-14

我是不是应该把它留在OP_WRITE中直到所有的数据都被刷新完?或者我应该更改为OP_READ,并尝试在两者之间进行任何读取?

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

如果写入通道已经满了,我不能写了,我是不是一直循环直到我可以开始写东西?

如果连接突然阻塞,我不确定是否应该只写我能写的,翻转回OP_READ,尝试读取,然后翻转回op_write。从我读到的内容来看,这似乎不是一种正确的做事方式(并且可能会导致大量的开销不断地来回切换?)。

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

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

是的,否则你只是抽CPU

 类似资料:
  • 我在Internet上到处找了找,但我没有找到这个简单问题的直接答案:在JavaFX应用程序中切换场景的最佳方法是什么?我有几个FXML文件和控制器,每一个,我希望能够在他们之间切换尽可能快(屏幕大小应该保持不变,所有关于窗口应该保持不变,除了内容)。 我可以考虑多种方法,最常见的方法是用FXMLLoader加载FXML文件,然后创建一个新场景,然后将这个场景设置为舞台,最后显示舞台。这是可行的,

  • 问题内容: 平台: PHP和mySQL 出于实验目的,我在自己的网站上尝试了很少的XSS注入。考虑这种情况,我可以输入表单textarea。由于这是一个文本区域,因此我可以输入文本和各种(英文)字符。这是我的观察结果: 一个)。如果仅在将数据插入数据库之前才应用strip_tags和mysql_real_escape_string并且不对输入使用htmlentities, 则查询将中断 ,由于异常

  • 我在两个线程中使用一个SocketChannel,一个线程用于发送数据,另一个线程用于接收数据。 线程1:使用上述socketchannel写入数据 线程2:使用相同的socketchannel读取数据 我没有在socketchannel中使用任何选择器,因为我需要写和读是异步的(使用两个不同的线程) 问题:当连接丢失时,socketchannel。write()和socketchannel。re

  • 我是android新手,我为自己写了一个代码,当按下按钮时,它会切换到另一个活动,但我想把它连接到密码和用户名。 如果“用户名”

  • 我有一段使用Codahale度量的旧代码。我想把它换成千分尺。我可以切换简单的对象,但我在重现某些Codahale特定对象的功能时会遇到一些问题。 我很好地切换到简单的对象,但我在复制某些特定于Codahale对象的功能时遇到了一些困难。在这方面,我没有发现任何令人满意的比较。我是基于文档和文章,但仍然没有运气。我不知道我想做的事是否可能。 例如,以微米为单位,这看起来如何? 或者只是一个简单的弦

  • TLDR:如果我使用Tomcat而不是Glassfish,或者使用jkd 1.7而不是JDK1.8,我是否必须使用不同的语法来访问我的servlet?我无法让jquery ajax与servlet通信(在Eclipse1.7JDK tomcat中,而不是在Netbeans1.8JDK glassfish中) 我试图将我的项目从Netbean 1.8 JDK转换为Eclipse 1.7 JKD。 它