java.nio.channels
public abstract class ServerSocketChann extends AbstractSelectableChannel implements NetworkChannel
ServerSocketChannel从SelectableChannel中继承了configureBlocking()和register()方法。
ServerSocketChannel是一个可以监听新进来的TCP连接的通道,就像标准IO中的ServerSocket一样。
ServerSocketChannel并没有public类型的构造方法,必须通过静态方法open()来创建ServerSocketChannel对象。每个ServerSocketChannel对象都与一个ServerSocket对象关联。ServerSocketChannel的socket()方法返回与他关联的ServerSocket对象。可通过以下方式把服务器进程绑定到一个本地端口:
serverSocketChannel.socket().bind(port);
ServerSocketChannel的主要方法如下:
- open() —— 静态工厂方法,返回一个ServerSocketChannel对象,这个对象没有与任何本地端口绑定,并且处于阻塞模式
- close() —— 关闭ServerSocketChannel
- accept() —— 类似于ServerSocket的accept()方法,用于接受客户的连接。如果ServerSocketChannel处于非阻塞状态,当没有客户连接时,该方法立即返回null;如果ServerSocketChannel处于阻塞的状态,当没有客户连接时,它会一直阻塞下去,直到有客户连接就绪,或者出现了IOException
- configureBlocking —— 设置阻塞/非阻塞模式
- validOps() —— 返回ServerSocketChannel所能产生的事件,这个方法总是返回SelctionKey.OP_ACCEPT
- socket() —— 返回与ServerSocketChannel关联的ServerSocket对象,每个ServerSocketChannel对象都与一个ServerSocket对象关联
非阻塞模式示例:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false);
while(true){
SocketChannel socketChannel = serverSocketChannel.accept();
if (socketChannel != null){
// do something with socketChannel... ...
}
}