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

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语言的众多内容,现在我们将来学习一下怎么把这些内容结合起来。我们将设计编写一个能够 做 一些确实有用的事情的程序。 问题 我提出的问题是: 我想要一个可以为我的所有重要文件创建备份的程序。 尽管这是一个简单的问题,但是问题本身并没有给我们足够的信息来解决它。进一步的分析是必需的。例如,

  • 大家好,所以我想编写一个代码来执行以下操作:java方法,它将获得两个排序的堆栈a和B(最小值),并返回一个排序的堆栈D(最小值)。您只允许使用堆栈操作,如pop、push、isEmpty和PEEK。示例:假设a={(top)1,4,7,9},b={(top)2,3,6},那么函数将返回一个新堆栈d={(top)1,2,3,4,6,7,9} 但这对我不起作用:(这是代码,我已经准备好接受任何建议

  • 我们已经学习如何创建我们自己的Python程序/脚本,以及在编写这个程序中所设计到的不同的状态。你可以发现它们在创建你自己的程序的时候会十分有用,让你对Python以及解决问题都变得更加得心应手。 接下来,我们将讨论面向对象的编程。

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