异步套接字和NIO之间的区别并将它们一起使用?

时间:2015-10-16 07:55:57

标签: sockets asynchronous nio

我正在做一个他们建议我们使用NIO而不是套接字的项目:我知道在NIO中很多客户端都可以注册选择器,并且当客户端有数据时,该选择器会分配一个worker,但是一旦注册了客户端就会使用套接字保持服务器被阻止。

但是什么是异步套接字呢?我想如果我使用NIO服务器那么我还应该使用NIO客户端吗?但我看到很多代码在客户端使用异步套接字,但套接字不会阻塞吗?如果是这样,它们在哪里阻塞?如何在每一端使用2种技术?

注意:如果有人解释或提供了一些好的参考资料,我希望如此,但我已经读了很多,我很困惑,所以我更愿意解释他们的差异和什么如果我有一个异步客户端套接字和NIO服务器,就会发生这种情况。

2 个答案:

答案 0 :(得分:1)

首先让我们解释一下NIO和Async操作和websockets之间的区别。

无阻止 - - 表示服务器/客户端/应用不会阻止。它通常仅指它运行的过程(虽然它可能影响另一方,就像websockets一样)。这可以通过多种方式实现,只使用同步方式的线程,使用异步操作(单线程或多线程,单线程node.js样式等。

Async - 是一种无阻塞方式来处理操作的实现。

Java NIO - 非阻塞服务器的Java实现 -

  

Java NIO(新IO)是Java的替代IO API(来自Java 1.4),   意味着替代标准Java IO和Java Networking API。   Java NIO提供了一种不同于标准的IO工作方式   IO API。   http://tutorials.jenkov.com/java-nio/index.html

WebSockets - 在JavaScript项目中使用套接字的实现,套接字可以使用多种方式,以及一系列实现它们的库。这个想法是提供一个基于套接字的JS应用程序的界面。

解释所有这些后,让我们来看看你在问什么。

表示Java.NIO只在服务器上,根本不关心客户端!我怀疑您可能需要使用JAVA.NIO客户端,或者找到一种方法来获得支持websockets的实现。客户端如何连接和管理它取决于客户端,它可能是applet或js脚本,服务器只是希望客户端连接遵循某个协议或以某种方式进行通信。客户端可能阻塞或无阻塞,服务器根本不会关心它。简而言之,似乎服务器使用winsocket之类的连接寻找客户端连接(这与websockets协议不同)。您应该寻找支持WebSockets的JAVA NIO,或者实现您自己的选择器等。以下是如何使用WebSockets构建Java服务器 - https://www.youtube.com/watch?v=_Fi4vz6oUio

WebSockets客户端可以使用多种方式进行通信(池,异步和其他许多方式,并且往往是非阻塞的),有各种各样的库,例如socket.io或者这里是各种实现的列表: https://en.wikipedia.org/wiki/Comparison_of_WebSocket_implementations。您可以在客户端使用socket.io并找到服务器端websocket的良好实现,然后将其与NIO Java Server一起使用..

无论哪种方式,阻止都可能发生在客户端/服务器上,或两者兼而有之。这实际上取决于你如何实现每个,但无论哪种方式你必须选择兼容的技术,这里没有正确或错误的答案。但是如果你正在运行javascript,那么你需要使用websockets或者它的某种形式:)

我希望这会有所帮助。

答案 1 :(得分:-2)

  • 阻止:方法阻止,直到操作完成或发生错误
  • 非阻塞:该方法永远不会阻止:它要么立即完成,要么报告错误,如果你以阻止模式执行它就会阻止
  • 异步:该方法立即返回,操作在后台继续,并在完成时执行集合点或回调。