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

Difference between asynchronous sockets and NIO and using them together?

我正在做一个项目,他们建议我们使用 NIO 而不是套接字:我知道在 NIO 中,许多客户端可以向选择器注册,并且当客户端有数据时,该选择器会分配一个工作人员,但一旦有套接字已注册的客户端会阻止服务器。

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

注意:如果有人解释或提供一些好的参考,我会很高兴,但我已经读了很多,我很困惑,所以我更喜欢这样的解释他们的差异以及如果我有一个异步客户端套接字和 NIO 服务器会发生什么。

首先让我们解释一下NIO和Async操作和websockets有什么区别。

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

Async - 是一种 none 阻塞方式来处理操作。

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

Java NIO (New IO) is an alternative IO API for Java (from Java 1.4), meaning alternative to the standard Java IO and Java Networking API's. Java NIO offers a different way of working with IO than the standard IO API's. http://tutorials.jenkov.com/java-nio/index.html

WebSockets - 在 JavaScript 项目中使用套接字的实现,套接字有多种工作方式,以及一些实现它们的库..想法是为 JS 应用程序提供基于套接字的接口。

解释完所有这些之后,让我们看看您要问什么。

意思是Java.NIO只在服务端,完全不关心客户端!我怀疑您可能需要使用 JAVA.NIO 客户端,或者找到一种方法来实现支持 websockets。客户端如何连接和管理它的端取决于客户端,它可能是一个小程序或 js 脚本,服务器只是希望客户端连接遵循某种协议或以某种方式进行通信。客户端可以阻塞或 none-阻塞,服务器根本不关心这些。从简短的角度来看,服务器似乎使用类似 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,或者它的某种形式:)

希望对您有所帮助。

  • 阻塞:方法阻塞,直到操作完成或发生错误
  • 非阻塞:该方法从不阻塞:它要么立即完成,要么报告一个错误,说明如果您以阻塞模式执行它,它将阻塞
  • 异步:方法 returns 立即执行,操作在后台继续,完成时执行集合点或回调。