当前位置: 首页 > 教程 > Java NIO >

Java NIO ServerSocketChannel

精华
小牛编辑
188浏览
2023-03-14

1 ServerSocketChannel的介绍

Java NIO ServerSocketChannel是一个通道,可以侦听传入的TCP连接,就像ServerSocket在标准Java Networking中一样。该ServerSocketChannel班位于java.nio.channels包。

这是一个例子:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

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

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

    //do something with socketChannel...
}

2 打开一个ServerSocketChannel

ServerSocketChannel通过调用该ServerSocketChannel.open() 方法来 打开一个。看起来是这样的:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

3 关闭ServerSocketChannel

ServerSocketChannel通过调用ServerSocketChannel.close() 方法来 关闭a 。看起来是这样的:

serverSocketChannel.close();

4 监听传入的连接

通过调用ServerSocketChannel.accept() 方法来监听传入的连接。当accept()方法返回时,它返回一个SocketChannel与传入的连接。因此,该accept()方法将阻塞,直到传入连接到达为止。

由于您通常不希望仅侦听单个连接,因此可以accept()在while循环中进行调用 。看起来是这样的:

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

    //do something with socketChannel...
}

当然,除了truewhile循环外,您还可以使用其他停止条件。

5 非阻塞模式

ServerSocketChannel可以将 A设置为非阻止模式。在非阻塞模式下,该accept()方法立即返回,如果没有传入连接到达,则该方法可能因此返回null。因此,您将必须检查返回的 SocketChannel是否为null。这是一个例子:

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