美文网首页
ServerSocketChannel

ServerSocketChannel

作者: JiinYuu | 来源:发表于2018-12-11 15:14 被阅读0次

Java NIO的ServerSocketChannel就是用来监听TCP连接的,就像标准的Java网络编程里的ServerSocket一样。ServerSocketChannel类在java.nio.channels包下。

如下示例:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

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

while (true) {
    SocketChannel socketChannel = serverSocketChannel.accept();
    // 操作socketChannel
}

Opening a ServerSocketChannel

调用ServerSocketChannel.open()放可以打开一个ServerSocketChannel。就像这样:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

Closing a ServerSocketChannel

调用ServerSocketChannel.close()放可以关闭一个ServerSocketChannel。就像这样:

serverSocketChannel.close();

Listening for Incoming Connections

调用ServerSocketChannel.accept()方法可以监听连入的TCP连接。当accpet()方法返回的时候,它会返回一个带着连入的连接信息的SocketChannel。也就是说,accept()方法会阻塞至有新的连接到达。

一般我们都不会只监听一个连接,所以你可以在一个while-循环内部调用accpet()方法。就像这样:

while (true) {
    SocketChannel socketChannel = serverSocketChannel.accept();
    // 操作socketChannel
}

当然,除了用true作为while-循环的条件,你还可以用其他的停止条件。

Non-blocking Mode

ServerSocketChannel可以设置为非阻塞模式。在非阻塞模式下,accept()方法会立即返回,因此此时没有新的连接,它会返回null。因此你需要检查返回的SocketChannel是否为null。如下:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

serverSocketChannel.socket().bind(new InetAddress(9999));
serverSocketChannel.configureBlocking(false);

while (true) {
    SocketChannel socketChannel = serverSocketChannel.accept();
    if (Objects.nonNull(socketChannel)) {
        // 操作socketChannel
    }
}

说明

发现貌似有人在看这个系列文章了,有必要说明下,这个Java NIO系列来源于jenkov.com,本文只是翻译,希望大家千万不要误会,本文不是原创。原文地址:Java NIO

相关文章

网友评论

      本文标题:ServerSocketChannel

      本文链接:https://www.haomeiwen.com/subject/vitehqtx.html