- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为一些背景:
我通过 SocketChannel、SelectionKey...等连接到服务器。在客户端,如果我想向服务器发送一些内容,我只需将数据写入 ByteBuffer 并通过套接字 channel 发送即可。如果所有内容都已写入,我就完成并可以返回到 OP_READ。如果没有全部写入,我会取出剩下的字节,将它们存储在某个“要发送”缓冲区中,并在键上标记 OP_WRITE(替换 OP_READ 使其仅写入是一个好主意吗?)。
因此,下次我调用 selectNow() 时,我假设它将识别 OP_WRITE 并尝试刷新更多数据(我将尝试通过进入另一个包含要写入的数据的写入循环,并重复如果需要,请上一页)。
这让我想到两个问题:
如果写入 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/
是否有使用 switch 语句检查数字 0-9 的简单方法?我正在编写一个程序来检查某些字符和数字。就像检查“\0”、“F”或“f”一样,想知道是否还有一种方法可以以类似的方式检查 0-9。我知道我可
我有一些数据需要转换,为此我需要一个超过 50 个案例的切换条件,我需要 3 次相同的案例,但在第三次我需要 50 个案例和一些更多,我不想写两次相同的代码。也许有可能做这样的事情。 switch (
我遇到这种情况,我必须检查两个 GET 变量。在检查语句内的第一个 switch 语句后,必须在第一个 case 循环内的第二个 switch 语句中检查第二个变量。 我无法在这里发布确切的代码,但这
如何使用函数指针代替 switch 语句? 最佳答案 与 ars 发布的链接略有不同的方法:您可以将 switch 语句中的值用作函数指针数组中的数组索引。所以不要写 switch (i) {
我必须评估很多条件。就我而言,我必须做这样的事情: switch(id) { case 5: // switch some other cases here case
switch 按钮位于 switch 语句内,但仅在 switch 语句外部时才有效这是我的代码:
我试图在 switch 语句中有一个 case 跳转到不同的 switch 语句。 在实践中,我希望用户在文本框中键入“关闭页面”,并且在浏览器关闭页面之前,我希望询问用户是否确定。输入“yes”将关
(引用java)我试图确定哪个更好,编写更多代码并可能节省一些计算时间,或者编写更少代码但可能牺牲一些计算时间。这就是我好奇的地方这样做会更有效率吗: switch (availability) {
我正在尝试构建一个 Android 应用程序,该应用程序可以访问加速度计传感器,并在单击按钮时将加速度计值(由 <> 包围)输出到串行 USB。当我更新值并尝试在 onClick 命令中调用它时遇到问
如何使用 Dwoo 模板引擎实现 switch case 语法。 最佳答案 {if 3 == 5} never gonna happen {elseif 3 == 3} if you don'
我想知道一个大的 switch 语句和几个小的 switch 语句之间是否有性能差异。 包含数百个案例的大型 switch 语句。 switch(quest){ case 1:
用户在 2 个选择框中进行选择后,我尝试计算出报值(value)。 看起来 1 需要 2 个 switch 语句。这可能吗? (可能的值比下面的值多得多。为了清楚起见,我删除了它们) var wor
我在主 while 循环内有一个开关,它将运行我的游戏。我正在尝试打破我的开关,以便转到不同的案例。下面的例子更好地解释了这一点: int j = 0; While(1){ switch(j){ ca
我用 Java 创建了一个菜单,其中每个选项都有另一个菜单。我想知道是否可以从内部菜单退出回到主菜单。 编辑:添加了主菜单选项 System.out.println("Main Menu");
我有一个计算新分数的方法。下面的方法有效,但问题是代码本身看起来可以被显着清理。我只是不知道什么是最好的方法。我根据 filterString 和枚举 individualScoreState 分配
在 Lisp 中使用字符串切换语句。 (defun switch(value) (case value (("XY") (print "XY"))
我想做这样的事情: int i = 0; switch(difficulty) { case 1: i++; break; case 2: i--; break; defaul
在 Obj-c 中,我做了一个 switch 语句,我曾经使用 UIsplitviewcontroller 在我的 iPad 应用程序中四处移动现在我想快速地做同样的事情……我试了几个小时,现在我唯一
我想写一个结构如下的报告: \begin{document} \input[option=a]{class} \input[option=b]{class} \in
我正在认真阅读 ngSwitch 的 AngularJS API 引用。当我谈到那部分时的指令: place an expression on the on="..." attribute (or t
我是一名优秀的程序员,十分优秀!