为什么Socket使用流但NIO SocketChannel使用读/写?

时间:2016-11-21 19:44:15

标签: java sockets nio

我正在尝试编写一个非阻塞客户端/服务器,我已经注意到Socket提供了getInputStream()getOutputStream(),但SocketChannel提供了read()和{ {1}}。

以下问题都是相关的,是为了更好地了解情况:

  • 为什么这些对象在提供数据包数据方面有所不同?
  • 这是阻塞与非阻塞的副作用还是仅仅是不同的副作用 在实施?
  • 这是我在决定如何从套接字读取时需要考虑的事情吗?
  • 我是否可以收到一个不完整的数据包,其中缓冲区的结束时间早于任一实现中的预期?

1 个答案:

答案 0 :(得分:1)

  

为什么这些对象在提供分组数据方面有所不同?

因为否则他们会是一样的。 NIO的设计者认为他们必须将数据,位置,容量和限制封装到一个类中。

  

这是阻塞与非阻塞的副作用还是仅仅是实现上的差异?

不,是的。

  

在决定如何从套接字读取时,我需要考虑这个问题吗?

当然。

  

我是否可以收到一个不完整的数据包,其中缓冲区在任一实现中的结束时间早于预期?

是。这是TCP / IP的属性,而不是Java的属性。