当前位置: 首页 > 面试题库 >

SocketChannel.write()编写问题

景帅
2023-03-14
问题内容

这里的问题是我可以看到数据正在写到套接字,但始终没有发送。

这是一个代码片段

ByteBuffer writeBuffer = ByteBuffer.allocate(8192);
writeBuffer.clear();
writeBuffer.put("heartbeat".getBytes());


writeBuffer.flip();
LOG.debug("is connected: " + socketChannel.isConnected());
int bytesWritten = 0;
if (key.isWritable()) {
    while (writeBuffer.hasRemaining()) {
        bytesWritten += socketChannel.write(writeBuffer);
    }
}

我使用TCPMon来查看是否将实际数据写到套接字-这样做是。

但是使用WireShark(另一个网络监视工具)时,我看不到数据包通过NIC。

任何帮助,将不胜感激


问题答案:

无论如何,您的代码是错误的。如果写入返回零,则套接字发送缓冲区已满,因此您应该注册OP_WRITE并返回到select循环,而不是浪费时间旋转直到再次有空间。您当前的技术使其他服务渠道匮乏,并且浪费了CPU周期。

而且,此时的测试isConnected()是徒劳的。它是。您已连接。该方法告诉您套接字的状态,而不是连接的状态。



 类似资料:
  • 我在PHP中有一个CSV字符串,它被mb_detect_编码检测为UTF8。此字符串将写入文件。当我在文本编辑器(程序员记事本)中打开它时,编辑器会说它是UTF8无标记的,当我将编码更改为ANSI时,它会在Excel中正确打开。我想用ANSI编写这个文件,这样在Excel中打开它之前就不必在文本编辑器中进行转换。尝试使用以下命令: utf8_解码($xhtml) iconv(“UTF-8”、“Wi

  • 对于Symfony来说,这是一个非常新的概念,我想让CMF正常工作,但是我在使用composer安装它时遇到了问题 在终端运行代码时,我得到了这个 警告:锁文件不是最新的composer.json.您可能会得到过时的依赖项。运行更新以更新它们。您的需求无法解析为一组可安装的包。 问题1 -symfony/icu 1.2的安装请求。x-dev- 问题2 -symfony/icu 1.2。x-dev需

  • 目录表 问题 解决方案 版本一 版本二 版本三 版本四 进一步优化 软件开发过程 概括 我们已经研究了Python语言的众多内容,现在我们将来学习一下怎么把这些内容结合起来。我们将设计编写一个能够 做 一些确实有用的事情的程序。 问题 我提出的问题是: 我想要一个可以为我的所有重要文件创建备份的程序。 尽管这是一个简单的问题,但是问题本身并没有给我们足够的信息来解决它。进一步的分析是必需的。例如,

  • 当你编写了一个可以用于多个软件包的特征测试时,最好用一个新宏把它苤装起来。下面是一些关于编写 Autoconf宏的要求(instructions)和指导(guidelines)。 宏定义 Autoconf宏是用宏AC—DEFUN定义的,该宏与m4的内置define宏相似。 除了定义一个宏,AC—DEFUN把某些用于限制宏调用顺序的代码添加到其中。 (参见 首要的宏 )。 一个Autoconf宏像下

  • 我们已经通过一些例子查看并编写了一些spec,现在是更进一步查看spec框架本身的时候了。确切地说,你在Atom中如何编写测试呢? Atom使用Jasmine作为spec框架。任何新的功能都要拥有specs来防止回归。 创建新的 spec Atom的spec和包的spec都要添加到它们各自的spec目录中。下面的例子为Atom核心创建了一个spec。 创建spec文件 spec文件必须以-spec

  • 本节将带着大家利用前面章节所学到的知识使用Python和PyInstalle自己的exp,在前面的章节,讲到了如何把一个python脚本编译成为一个可执行的PE文件,现在让我们利用前面学到的知识快速写一个windows工具脚本. 开始编码 大家其实会发现,很多恶意中间件最想干的一件事情就是获得被攻击系统的持久性(永久的潜伏在系统里面,永久性后门),像在windows里面最常见的一种方式就是被攻击系