參考:http://ifeve.com/server-socket-channel/
原文地址
目錄
- Java NIO教程
- Java NIO 教程(一) 概述
- Java NIO 教程(二) Channel
- Java NIO 教程(三) Buffer
- Java NIO 教程(四) Scatter/Gather
- Java NIO 教程(五) 通道之間的數(shù)據(jù)傳輸
- Java NIO 教程(六) Selector
- Java NIO 教程(七) FileChannel
- Java NIO 教程(八) SocketChannel
- Java NIO 教程(九) ServerSocketChannel
- Java NIO 教程(十) 非阻塞式服務(wù)器
- Java NIO 教程(十一) Java NIO DatagramChannel
- Java NIO 教程(十二) Pipe
- Java NIO 教程(十三) Java NIO vs. IO
- Java NIO 教程(十四) Java NIO Path
- Java NIO 教程(十五) Java NIO Files
- Java NIO 教程(十六) Java NIO AsynchronousFileChannel
Java NIO中的 ServerSocketChannel
是一個(gè)可以監(jiān)聽新進(jìn)來的TCP連接的通道, 就像標(biāo)準(zhǔn)IO中的ServerSocket
一樣。ServerSocketChannel
類在 java.nio.channels
包中优幸。
這里有個(gè)例子:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
while(true){
SocketChannel socketChannel =
serverSocketChannel.accept();
//使用socketChannel做一些工作...
}
打開 ServerSocketChannel
通過調(diào)用 ServerSocketChannel.open()
方法來打開ServerSocketChannel
.如:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
關(guān)閉 ServerSocketChannel
通過調(diào)用ServerSocketChannel.close()
方法來關(guān)閉ServerSocketChannel
. 如:
serverSocketChannel.close();
監(jiān)聽新進(jìn)來的連接
通過 ServerSocketChannel.accept()
方法監(jiān)聽新進(jìn)來的連接漱挚。當(dāng) accept()
方法返回的時(shí)候,它返回一個(gè)包含新進(jìn)來的連接的 SocketChannel
爬虱。因此, accept()
方法會(huì)一直阻塞到有新連接到達(dá)。
通常不會(huì)僅僅只監(jiān)聽一個(gè)連接,在while
循環(huán)中調(diào)用 accept()
方法. 如下面的例子:
while(true){
SocketChannel socketChannel =
serverSocketChannel.accept();
//使用socketChannel做一些工作...
}
當(dāng)然,也可以在while
循環(huán)中使用除了true
以外的其它退出準(zhǔn)則届垫。
非阻塞模式
ServerSocketChannel
可以設(shè)置成非阻塞模式禾酱。在非阻塞模式下,accept()
方法會(huì)立刻返回盒揉,如果還沒有新進(jìn)來的連接,返回的將是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){
//使用socketChannel做一些工作...
}
}