Java 中的套接字程序可以在阻塞和非阻塞模式下工作。在阻塞套接字模式下,系统调用事件会暂停执行,直到收到适当的回复。在非阻塞套接字中,即使系统调用已被调用,它也会继续执行,并在稍后适当地处理其回复。本文详细阐述了非阻塞套接字编程的概念及其相关领域,并附有适当的示例。
概述
有不同类型的套接字,它们的类型根据它们的通信属性进行分类。通信属性由它们支持的协议定义。通常,它需要相同类型的套接字来建立任何类型的通信,因为传输数据的标准规则集是由它们使用的协议定义的。协议是 TCP 或 UDP。应用程序指定它支持的协议。通常,一个应用程序支持多个协议,因为编写它的程序员提供了所需的代码来支持该域中的特定套接字类型。如果你一直想知道 TCP/IP 支持的类型套接字,它们如下:
阻塞和非阻塞套接字都有其用途,但是阻塞套接字更常见,因为它们易于处理并且是 Java 中套接字编程的默认选择。简而言之:在阻塞套接字程序中,代码行一个接一个地执行,但它们在进行系统调用的指令处被阻塞或停止。它在那里等待,直到收到适当的回复、发生超时或遇到某些错误。另一方面,非阻塞套接字程序不等待回复并继续执行,即使调用可能尚未完成。来自被调用系统调用的任何不完整回复都将单独处理。
阻塞与非阻塞套接字的使用
阻塞套接字适用于系统调用的回复至关重要的情况。例如,假设一个客户端程序想要连接到服务器。程序必须仅在建立连接或发生某些错误时才响应。这意味着套接字必须阻止用户控制,直到收到适当的回复。
另一方面,考虑一个客户端正在尝试建立多个连接,并且每个连接都可以独占另一个。在这种情况下,套接字一定不能死板地阻塞另一个系统调用来建立连接。这是非阻塞套接字的场景。
Java中的非阻塞套接字
Java 有 TCP 和 UDP 套接字。ServerSocket 和 Socket 类中定义的 connect()、accept()、read() 和 write() 等方法用于阻塞套接字编程。例如,当客户端调用 read() 方法从服务器读取数据时,线程会被阻塞,直到数据可用。这种情况在某些情况下是不可取的。相反,我们可以做的是利用等待时间来做一些其他的任务。然后,客户端套接字可以在数据可用时发出通知。另一个问题是,在多套接字连接中,每个客户端都是一个单独的线程。因此,存在维护客户端线程池的开销。
由于顺序执行,阻塞套接字很简单。另一方面,非阻塞套接字是非顺序的。它们需要不同的视角来在编程中实现它们。在某种程度上,非阻塞套接字程序有点复杂,而且是更高级的套接字通信技术。
非阻塞套接字 API
Java中支持非阻塞套接字通信的类如下:
总结
除了 Java API 库提供了一些专门解决非阻塞套接字编程问题的额外类之外,其实现或多或少类似于普通套接字编程。