内容目录
3.5 Socket 通道
现在让我们来学习模拟网络套接字的通道类。Socket通道有与文件通道不同的特征。
新的socket通道类可以运行非阻塞模式并且是可选择的。这两个性能可以激活大程序(如网络服务器和中间件组件)巨大的可伸缩性和灵活性。本节中我们会看到,再也没有为每个socket连接使用一个线程的必要了,也避免了管理大量线程所需的上下文交换总开销。借助新的NIO类,一个或几个线程就可以管理成百上千的活动socket连接了并且只有很少甚至可能没有性能损失。
从图 3-9 可知,全部socket通道类(DatagramChannel
、SocketChannel
和ServerSocketChannel
)都是由位于java.nio.channels.spi
包中的AbstractSelectableChannel
引申而来。这意味着我们可以用一个Selector
对象来执行socket通道的有条件的选择(readiness selection)。选择和多路复用I/O会在第四章中讨论。
请注意DatagramChannel
和SocketChannel
实现定义读和写功能的接口而ServerSocketChannel
不实现。ServerSocketChannel
负责监听传入的连接和创建新的SocketChannel
对象,它本身从不传输数据。
在我们具体讨论每一种socket通道前,您应该了解socket和socket通道之间的关系。之前的章节中有写道,通道是一个连接I/O服务导管并提供与该服务交互的方法。就某个socket而言,它不会再次实现与之对应的socket通道类中的socket协议 API,而java.net
中已经存在的socket通道都可以被大多数协议操作重复使用。
全部socket通道类(DatagramChannel
、SocketChannel
和ServerSocketChannel
)在被实例化时都会创建一个对等socket对象。这些是我们所熟悉的来自java.net
的类(Socket
、ServerSocket
和DatagramSocket
),它们已经被更新以识别通道。对等socket可以通过调用socket()
方法从一个通道上获取。此外,这三个java.net
类现在都有getChannel()
方法。
虽然每个socket通道(在java.nio.channels
包中)都有一个关联的java.net
socket对象,却并非所有的socket都有一个关联的通道。如果您用传统方式(直接实例化)创建了一个Socket对象,它就不会有关联的SocketChannel
并且它的getChannel()
方法将总是返回null
。
Socket 通道委派协议操作给对等socket对象。如果在通道类中存在似乎重复的socket方法,那么将有某个新的或者不同的行为同通道类上的这个方法相关联。
0 条评论
撰写评论