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

SocketChannel read()行为-短读

景嘉志
2023-03-14
问题内容

ServerSocketChannel使用这种方式:

ServerSocketChannel srv = ServerSocketChannel.open();
srv.socket().bind(new java.net.InetSocketAddress(8112));
SocketChannel client = srv.accept();

接收到连接后,将通过以下方式读取数据:

ByteBuffer data = ByteBuffer.allocate(2000);
data.order(ByteOrder.LITTLE_ENDIAN);
client.read(data);
logger.debug("Position: {} bytes read!", data.position());

它打印:

位置:读取16个字节!

为什么直到填充缓冲区后SocketChannel才阻塞?
ServerSocketChannel.accept()API(Java 7):

此方法返回的套接字通道(如果有)将处于阻塞模式,而与该通道的阻塞模式无关。

write(ByteBuffer buffer)SocketChannel的是否阻塞?我该如何测试呢?

感谢您的时间!


问题答案:

阻止模式意味着它将一直阻止,直到接收到 任何 数据为止。它不必是整个缓冲区都已满。

如果要确保已收到整个缓冲区的数据,则应read()循环执行,直到填满缓冲区。



 类似资料:
  • 市场人员在【短信营销】开通后,只要拥有短信配额即可向目标客户群体进行短信群发; 1、访问【短信营销】- 【短信推广】列表,点击【+新建短信推广】进行短信推广; 2、在新建短信推广页面,选择需要推广的市场活动、发送的目标客户群体以及短信内容; 群发对象可以选择已经设置好的目标人群或者是通过Excel文件上传发送对象的手机号码; 3、完成短信发送后,在短信推广列表即可点击“短信内容”查看短信送达详情;

  • 我试图将Auth0整合到我的web应用程序用户登录中。但是,我总是得到“无效的验证码格式。”。 我注意到 Auth0Lock 提供的验证码是 ,而直接 GET 返回的验证码要大得多 。 问题是:有了Auth0,我应该如何使用校验码来换取access_token。

  • 读取 M600 上的短信 如果您在手机上使用短信通知,在您收到新的短信时您会在 M600上看到一项通知。 读取短信 轻触通知。 通过 M600 回复短信 仅适用于与 Android 手机配对的 Polar M600。 您可以在手腕上回复短信。 如需回复短信 轻触通知查看所有短信 从屏幕底部向上滑动查看您可以进行的操作。 轻触Reply(回复)。 请选择您是语音回复、打字回复还是使用表情符号。或从屏

  • 问题内容: 我不明白为什么尚未进行如此基本的优化: 即使结论是第一项证据,整个阵列也会被扫描。 问题答案: 这是不固定的性能下降。NumPy发行3446。实际上 存在 短路逻辑,但是对机器的更改在短路逻辑周围引入了不必要的基于块的外循环,并且该外循环不知道如何短路。您可以在此处看到关于分块机制的一些解释。 即使没有回归,短路影响也不会出现在您的测试中。首先,您要确定数组的创建时间,其次,我认为它们

  • 问题内容: 我正在尝试使用Apache Lucene创建可搜索的电话/本地业务目录。 我有街道名称,公司名称,电话号码等字段。我遇到的问题是,当我尝试按街道名称中包含多个单词(例如“新月”)的街道进行搜索时,没有返回结果。但是,如果我尝试仅用一个词(例如“新月”)进行搜索,那么我会得到所有想要的结果。 我正在使用以下索引数据: 我的搜索是这样的: 我尝试过将通配符查询替换为短语查询,首先将整个字符

  • 我注意到一个完整的语法分析在动词短语中嵌套了其他短语,比如这里(尽管名词短语似乎是独立的) 当我通过ApacheOpenNLP运行一个简单的分块时,动词短语是独立的,如下所示 尽管如此,ApacheOpenNLPS完全解析也嵌套了动词短语。(https://opennlp.apache.org/documentation/1.5.2-incubating/manual/opennlp.html#t