Nio Selector.select IO准备就绪

时间:2015-04-13 06:26:49

标签: java sockets tcp udp nio

在java NIO中,Selector.select()是否保证在套接字通道中至少有一个完整的UDP数据报内容可用,或理论上Selector可以在少于一个数据报时唤醒,比如几个字节?

如果传输协议是TCP会发生什么,关于Selector.select(),与UDP有区别吗?

来自API: 选择一组键,其相应的通道为I / O操作做好准备。

但是,它并没有指明现成的含义。

所以我的问题:

  • 传入的数据报/流如何从硬件转到Java应用程序套接字(通道)。

  • 使用UDP或TCP客户端时,是否应该假设至少有一个数据报被接收或者当只有一部分数据报可用时Selector可以唤醒?

1 个答案:

答案 0 :(得分:2)

  

但是,它并没有指明现成的含义。

     

所以我的问题:

     
      
  • 传入的包/流如何从硬件转到Java应用程序Socket(Channels)。
  •   

它们到达NIC,在那里它们被缓冲,然后传递到网络协议栈并从那里传递到套接字接收缓冲区。当你拨打read().

时,会从那里检索到它们
  
      
  • 使用UDP或TCP客户端时,应该假设至少收到一个包
  •   

你的意思是数据包。实际上在UDP的情况下,你的意思是数据报。你可以假设在UDP的情况下已收到整个数据报。

  当只有[数据包]的一部分可用时,

或Selector会唤醒?

对于TCP,您可以假设 至少有一个字节流的末尾可用。没有“'包装”这样的东西。或者'包'或者'消息'在TCP级别。