资源预览内容
第1页 / 共21页
第2页 / 共21页
第3页 / 共21页
第4页 / 共21页
第5页 / 共21页
第6页 / 共21页
第7页 / 共21页
第8页 / 共21页
第9页 / 共21页
第10页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
TCP/IP+NIO服务器端:1 ServerSocketChannel.open();打开 ServerSocketChannel,从而获得 ServerSocketChannel 实例对象。ServerSocketChannel针对面向流的侦听套接字的可选择通道服务器套接字通道不是侦听网络套接字的完整抽象。必须通过调用 socket 方法所获得的关联 ServerSocket 对象来完成对套接字选项的绑定和操作。不可能为任意的已有服务器套接字创建通道,也不可能指定与服务器套接字通道关联的服务器套接字所使用的 SocketImpl 对象。 通过调用此类的 open 方法创建服务器套接字通道。新创建的服务器套接字通道已打开,但尚未绑定。试图调用未绑定的服务器套接字通道的 accept 方法会导致抛出 NotYetBoundException。可通过调用相关服务器套接字的某个 bind 方法来绑定服务器套接字通道。public abstract ServerSocket socket()获取与此通道关联的服务器套接字。public static ServerSocketChannel open()throws IOException打开服务器套接字通道。 通过调用系统级默认 SelectorProvider 对象的 openServerSocketChannel 方法来创建新的通道。 新通道的套接字最初是未绑定的;可以接受连接之前,必须通过它的某个套接字的 bind 方法将其绑定到具体的地址。返回: 新的套接字通道 public abstract SocketChannel accept()throws IOException接受到此通道套接字的连接。 如果此通道处于非阻塞模式,那么在不存在挂起的连接时,此方法将直接返回 null。否则,在新的连接可用或者发生 I/O 错误之前会无限期地阻塞它。 不管此通道的阻塞模式如何,此方法返回的套接字通道(如果有)将处于阻塞模式。 此方法执行的安全检查与 ServerSocket 类的 accept 方法执行的安全检查完全相同。也就是说,如果已安装了安全管理器,则对于每个新的连接,此方法都会验证安全管理器的 checkAccept 方法是否允许使用该连接的远程端点的地址和端口号。 返回: 用于新连接的套接字通道,或者如果此通道处于非阻塞模式并且没有要接受的可用连接,则返回 null 2 ServerSocketChannel. configureBlocking(false);将 Channel 设置为非阻塞模式。public final SelectableChannelconfigureBlocking(boolean block) throws IOException调整此通道的阻塞模式。参数: block - 如果为 true,则此通道将被置于阻塞模式;如果为 false,则此通道将被置于非阻塞模式 3 ServerSocketChannel. Socket();获得 ServerSocket 对象,从而进行监听端口等的设置。4 ServerSocket.bind(port);制定服务器端监听的端口。public void bind(SocketAddress endpoint)throws IOException将 ServerSocket 绑定到特定地址(IP 地址和端口号)。如果地址为 null,则系统将挑选一个临时端口和一个有效本地地址来绑定套接字。 参数: endpoint - 要绑定的 IP 地址和端口号。 5 Selector.open();打开 Selector,从而获得 Selector 实例对象。类 Selector可通过调用此类的 open 方法创建选择器,该方法将使用系统的默认选择器提供者创建新的选择器。也可通过调用自定义选择器提供者的 openSelector 方法来创建选择器。通过选择器的 close 方法关闭选择器之前,它一直保持打开状态。通过 SelectionKey 对象来表示可选择通道到选择器的注册。public static Selector open() throws IOException打开一个选择器。 通过调用系统级默认 SelectorProvider 对象的 openSelector 方法来创建新的选择器。 返回: 新的选择器 6 ServerSocketChannel.register(Selector,int);向 ServerSocketChannel 实例对象注册 selector 实例对象和所感性趣的事情public final SelectionKey register(Selector sel, int ops) throws ClosedChannelException向给定的选择器注册此通道,返回一个选择键。 调用此便捷方法的形式为 sc.register(sel, ops)与下列方法调用完全相同: sc.register(sel, ops, null)参数: sel - 要向其注册此通道的选择器 ops - 所得键的可用操作集 返回: 表示此通道向给定选择器注册的键 7 while(true);正常情况下,保证服务器一直处于运行状态。8 selector.select();获取 selector 实例对象中需要处理的 SelectorKey 的数量。public abstract int select()throws IOException选择一组键,其相应的通道已为 I/O 操作准备就绪。 此方法执行处于阻塞模式的选择操作。仅在至少选择一个通道、调用此选择器的 wakeup 方法,或者当前的线程已中断(以先到者为准)后此方法才返回。 返回: 已更新其准备就绪操作集的键的数目,该数目可能为零 public abstract int select(long timeout) throws IOException选择一组键,其相应的通道已为 I/O 操作准备就绪。 此方法执行处于阻塞模式的选择操作。仅在至少选择一个通道、调用此选择器的 wakeup 方法、当前的线程已中断,或者给定的超时期满(以先到者为准)后此方法才返回。 此方法不提供实时保证:它安排了超时时间,就像调用 Object.wait(long) 方法一样。 参数: timeout - 如果为正,则在等待某个通道准备就绪时最多阻塞 timeout 毫秒;如果为零,则无限期地阻塞;必须为非负数 返回: 已更新其准备就绪操作集的键的数目,该数目可能为零 9 for(SelectionKey key:selector.selectedKeys()当 selector 实例对象中需要处理的 SelectionKey 的数量大于零时,遍历 selector.selectedKeys,以对每个 SelectionKey的事件进行处理。public abstract Set selectedKeys()返回此选择器的已选择键集。 可从已选择键集中移除键,但是无法直接添加键。试图向该键集中添加对象会导致抛出 UnsupportedOperationException。 已选择键集是非线程安全的。 返回: 此选择器的已选择键集 10 key.isAcceptable();判断 SelectionKey 的类型是否为客户端建立连接的类型。类 SelectionKeypublic abstract class SelectionKey extends Object表示 SelectableChannel 在 Selector 中的注册的标记。 每次向选择器注册通道时就会创建一个选择键。通过调用某个键的 cancel 方法、关闭其通道,或者通过关闭其选择器来 取消 该键之前,它一直保持有效。取消某个键不会立即从其选择器中移除它;相反,会将该键添加到选择器的 已取消键集 ,以便在下一次进行选择操作时移除它。可通过调用某个键的 isValid 方法来测试其有效性。 选择键包含两个表示为整数值的 操作集 。操作集的每一位都表示该键的通道所支持的一类可选择操作。 static int OP_ACCEPT 用于套接字接受操作的操作集位。static int OP_CONNECT 用于套接字连接操作的操作集位。static int OP_READ 用于读取操作的操作集位。static int OP_WRITE 用于写入操作的操作集位。public final boolean isAcceptable()测试此键的通道是否已准备好接受新的套接字连接。 调用此方法的形式为 k.isAcceptable() 形式,该调用与以下调用的作用完全相同: k.readyOps() & OP_ACCEPT != 0如果此键的通道不支持套接字接受操作,则此方法始终返回 false。 返回: 当且仅当 readyOps() & OP_ACCEPT 为非零值时才返回 true 11 key.channel();当 SelectorKey 的类型为 acceptable 时,从 SelectionKey 中获得其绑定的 ServerSocketChannel 对象。public abstract SelectableChannel channel()返回为之创建此键的通道。即使已取消该键,此方法仍继续返回通道。 返回: 此键的通道12 ServerSocketChannel.accept();接受客户端建立连接的请求,并返回 SocketChannel 对象。public abstract SocketChannel accept()throws IOException接受到此通道套接字的连接。 如果此通道处于非阻塞模式,那么在不存在挂起的连接时,此方法将直接返回 null。否则,在新的连接可用或者发生 I/O 错误之前会无限期地阻塞它。 不管此通道的阻塞模式如何,此方法返回的套接字通道(如果有)将处于阻塞模式。 此方法执行的安全检查与 ServerSocket 类的 accept 方法执行的安全检查完全相同。也就是说,如果已安装了安全管理器,则对于每个新的连接,此方法都会验证安全管理器的 checkAccept 方法是否允许使用该连接的远程端点的地址和端口号。 返回: 用于新连接的套接字通道,或者如果此通道处于非阻塞模式并且没有要接受的可用连接,则返回 null 类 SocketChannelpublic abstract class SocketChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel针对面向流的连接套接字的可选择通道。 套接字通道不是连接网络套接字的完整抽象。必须通过调用 socket 方法所获得的关联 Socket 对象来完成对套接字选项的绑定、关闭和操作。不可能为任意的已有套接字创建通道,也不可能指定与套接字通道关联的套接字所使用的 SocketImpl 对象。 13 SocketChannel.register(Selector,int);向 SocketChannel 注册感性趣的事件类型,支持的有:SelectionKey.OP_READ 和 SelectionKey.WRITE.14 key.isReadable();判断所获取的 SelectionKey 是否为 readable,如果是则意味着有消息流在等待处理。public final boolean isReadable()测试此键的通道是否已准备好进行读取。 调用此方法的形式为 k.isRead
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号