在java NIO中,Selector.select()是否保证Socket Channel上至少有一个完整的UDP数据报内容可用,或者理论上,当数据报少于一个数据报时,比如几个字节,Selector可以唤醒?
如果传输协议(protocol)是 TCP,会发生什么情况,对于 Selector.select() 来说,与 UDP 有区别吗?
来自 API: 选择一组按键,其相应 channel 准备好进行 I/O 操作。
但是它没有具体说明就绪的含义。
所以我的问题:
传入的数据报/流如何从硬件传输到 Java 应用程序套接字( channel )。
当使用 UDP 或 TCP 客户端时,是否应该假设至少收到一个数据报,或者当只有一部分数据报可用时选择器可以唤醒?
最佳答案
It doesn't however specify what ready means.
So my questions:
- how incoming packages/streams go from hardware to Java application Socket (Channels).
它们到达 NIC,在那里进行缓冲,然后传递到网络协议(protocol)栈,并从那里传递到套接字接收缓冲区。当您调用read().
时,可以从那里检索它们。
- when using UDP or TCP client, should one assume that at least one package is received
您的意思是数据包。实际上,对于 UDP,您的意思是数据报。对于 UDP,您可以假设已接收到整个数据报。
or Selector could wake when there is only a part of [packet] available?
对于 TCP,您可以假设至少有一个字节或流末尾可用。 TCP 级别不存在“包”或“数据包”或“消息”之类的东西。
关于java - Nio Selector.select IO 准备情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29599024/