现在的位置: 首页 > 综合 > 正文

Java NIO ServerSocketChannel

2017年05月22日 ⁄ 综合 ⁄ 共 1860字 ⁄ 字号 评论关闭

A Java NIO ServerSocketChannel is a channel that can listen for incoming TCP connections, just like a
ServerSocket in standard Java IO. The ServerSocketChannel class is located in the
java.nio.channels package.

Here is an example:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

serverSocketChannel.socket().bind(new InetSocketAddress(9999));

while(true){
    SocketChannel socketChannel =
            serverSocketChannel.accept();

    //do something with socketChannel...
}

Opening a ServerSocketChannel

You open a ServerSocketChannel by calling the ServerSocketChannel.open() method. Here is how that looks:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

Closing a ServerSocketChannel

Closing a ServerSocketChannel is done by calling the ServerSocketChannel.close() method. Here is how that looks:

serverSocketChannel.close();

Listening for Incoming Connections

Listening for incoming connections is done by calling the ServerSocketChannel.accept() method. When the
accept() method returns, it returns a SocketChannel with an incoming connection. Thus, the
accept() method blocks until an incoming connection arrives.

Since you are typically not interested in listening just for a single connection, you call the
accept() inside a while-loop. Here is how that looks:

while(true){
    SocketChannel socketChannel =
            serverSocketChannel.accept();

    //do something with socketChannel...
}

Of course you would use some other stop-criteria than true inside the while-loop.

Non-blocking Mode

A ServerSocketChannel can be set into non-blocking mode. In non-blocking mode the
accept() method returns immediately, and may thus return null, if no incoming connection had arrived. Therefore you will have to check if the returned
SocketChannel is null. Here is an example:

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...
    }
}

抱歉!评论已关闭.