套接字与常见网络 API 的关系
Posted
技术标签:
【中文标题】套接字与常见网络 API 的关系【英文标题】:How sockets relate to common networking APIs 【发布时间】:2011-01-24 17:13:26 【问题描述】:今天早上我问了一个与套接字相关的问题,但这是一个不同的问题,所以我决定单独发一个帖子。
我现在对什么是套接字以及它们的用途有了一个很好的了解。我试图了解它们与 Java NIO、Java RMI 以及 Netty 或 MINA 等所谓的网络 API 的关系。
套接字是所有基于 Java 的网络的基础,NIO 是基于 Java 的网络的基础吗(即,它是为 更高 框架提供套接字结构的 API,例如Netty 还是 MINA)?如果不是,那么 Java 网络能力的基础是什么?
是否可以使用套接字(据我理解,或网络层构造)来发送(按字节)符合更高协议(如 TCP 或 UDP、HTTP、FTP 等)的消息?如果是这样,我想开发团队可能会制作自己的 HttpProtocol 库或 SSLProtocol 库,是吗?
我的理解是NIO是所有Java网络的基础,RMI、Netty、MINA等都是将NIO框架扩展成自己的实现。它是否正确?如果不是,这些框架如何相互关联?
再次感谢您的帮助!
【问题讨论】:
【参考方案1】:套接字是所有基于 Java 的网络的基础吗?
对于 IP 协议,是的。可能有特殊的库,例如用于串口通信的JavaComm,以及用于各种不基于套接字的电信协议的JAIN
NIO 是基于 Java 的网络的基础
不是真的,套接字是。见上一个答案。 NIO 构建并增强了套接字,以及其他东西。最重要的部分可能是 NIO 允许您在单个线程中侦听多个套接字上的事件并执行非阻塞 IO。 Netty 和 Mina 充分利用了 NIO api。
NIO 代表 New I/O,是 Java 1.4 中引入的用于执行 IO 的新 API。不过,它除了套接字 IO 还做了很多其他的事情。可以说,NIO 将允许您以更复杂的代价更有效地进行套接字 IO。
是否可以使用套接字(据我理解,或网络层构造)来发送(按字节)符合更高协议(如 TCP 或 UDP)的消息,
没有。套接字使您可以访问诸如 TCP 或 UDP 之类的传输协议(实际上对于 Java,它只有 TCP 和 UDP,将来可能还会有 SCTP)。您可以构建在 TCP/UDP 之上工作的东西,而不是自己实现 TCP/UDP(除非您想在 TCP 或 UDP 之上实现 IP 堆栈 - 这是几个 *** 或 Tunelling 协议所做的)
HTTP、FTP 等?
是的,这些通常工作在 TCP 之上,您可以通过在 java 中使用套接字来实现 HTTP、FTP 和其他在 TCP/UDP 之上运行的协议——这就是套接字的用途。
【讨论】:
nos - 感谢您的出色回答。但是有一个问题:如果套接字是 Java 网络的基础,那么它们从何而来?它们必须在 Java 外部,可能由操作系统提供? 当然,文件/套接字是由操作系统提供的。 套接字不是基于串口的吗?与套接字和这个 JavaComm 或 JAIN 有什么不同?在某种基本层面上,它们不是都绑定到一个端口并监听 I/O 吗? “Serial Port”听起来像是一个通用术语,但在这种情况下,它的意思是“异步串行端口,可能是 RS-232”。套接字是 TCP/IP 或 UPD/IP,最常见的是基于以太网的。至少对于 LAN。 @Pam Sockets 非常具体,它们通常指的是一种特定的 API 样式(即 BSD Sockets en.wikipedia.org/wiki/Berkeley_sockets)。大多数操作系统和编程语言都采用了这种与某种形式的网络通信的接口方式。原生 C 套接字 API 可以让您访问整个范围的低级协议,主要是基于 TCP/IP,但也有其他协议,例如bluetooth、appletalk、X.25 等,但即使是原生 API 也有例外,例如串行编程。在 java 中,套接字仅用于 IP/UDP 和 IP/TCP。【参考方案2】:套接字是 Java 网络的基本构建块。它们只允许您执行基本操作:打开连接(TCP 或 UDP)、写入或读取字节以及关闭连接。他们还通过抛出异常来处理失败案例。在 OSI 模型中,这是第 4 层(传输)。
更高级别的 API 构建在套接字之上,它们允许执行更有趣的任务,例如 HTTP 连接或 SSL 通信。
Java NIO 是第一个 Java IO API 的新版本。就网络而言,它本质上为非阻塞套接字带来了新的 API。
更高级别的 API 构建在 Java IO 和/或 Java NIO 之上。
【讨论】:
感谢纪尧姆!所以,澄清一下:Java NIO/IO 是标准的 Java 套接字框架,而 Netty 或 MINA 等其他框架通过提供更高层协议的实现来构建在该框架之上,是吗?这同样适用于 Java RMI(RMI 是否像 Netty/MINA 一样扩展了 NIO?)。谢谢! 对,Java NIO/IO 实现套接字,而其他库在这些套接字之上实现更高级别的协议。 RMI 是一个用于与远程对象通信的包。 RMI 使用 URL 协议,所以大多数时候它会使用套接字进行通信。 谢谢!我想我对 RMI 感到困惑,因为我看到 NIO、Netty、MINA 等 API 都是基于套接字并实现特定协议的……RMI 实现了哪些协议,这与普通客户端有何不同/server 使用 Netty 进行通信? RMI 为调用位于远程服务器上的对象上的方法提供了连接。您可以将其视为与 HTTP、SOAP、JMS 处于同一级别的协议...... 纪尧姆,最后一个问题!所以总结一下 RMI 是一个 RPC 框架,它大量使用套接字(可能还有其他非套接字技术)来序列化客户端和服务器之间的对象,并且因为通信是在 2 个程序(客户端和服务器)之间进行的,所以它是否公平,那么这种序列化传输可以被视为“应用层”协议吗?再次感谢您迄今为止的所有帮助!以上是关于套接字与常见网络 API 的关系的主要内容,如果未能解决你的问题,请参考以下文章