您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
【第20章:Java新IO】_Selector
发布时间:2021-01-21 18:38:50编辑:雪饮阅读()
java.nio.channels.Selector类可以实现异步非阻塞服务端socket(多线程)
import java.net.InetSocketAddress ;
import java.net.ServerSocket ;
import java.util.Set ;
import java.util.Iterator ;
import java.util.Date ;
import java.nio.channels.ServerSocketChannel ;
import java.nio.ByteBuffer ;
import java.nio.channels.SocketChannel ;
import java.nio.channels.Selector ;
import java.nio.channels.SelectionKey ;
import java.net.ServerSocket;
import java.net.Socket;
public class Hello{
public static void main(String args[]) throws Exception {
int ports[] = {8000,8001,8002,8003,8005,8006} ; // 表示五个监听端口
Selector selector = Selector.open() ; // 通过open()方法找到Selector
for(int i=0;i<ports.length;i++){
ServerSocketChannel initSer = ServerSocketChannel.open() ; // 打开服务器的通道
initSer.configureBlocking(false) ; // 服务器配置为非阻塞
ServerSocket initSock = initSer.socket() ;
//实例化绑定地址
InetSocketAddress address = new InetSocketAddress(ports[i]) ;
//进行服务的绑定
initSock.bind(address);
//等待连接
initSer.register(selector,SelectionKey.OP_ACCEPT);
System.out.println("服务器运行,在" + ports[i] + "端口监听。") ;
}
// 要接收全部生成的key,并通过连接进行判断是否获取客户端的输出
int keysAdd = 0 ;
// 选择一组键(已经准备就绪的通道),并且相应的通道已经准备就绪。
//select方法有不同的重载,而默认的select的意思是至少有一个通道在你注册的事件上就绪了才返回。
while((keysAdd=selector.select())>0){
//取出全部生成的key
Set<SelectionKey> selectedKeys = selector.selectedKeys() ;
//准备iterator进行迭代
Iterator<SelectionKey> iter = selectedKeys.iterator() ;
while(iter.hasNext()){
SelectionKey key = iter.next() ; // 取出每一个key
//测试此键的通道是否已准备好接受新的套接字连接。
if(key.isAcceptable()){
ServerSocketChannel server = (ServerSocketChannel)key.channel() ;
SocketChannel client = server.accept() ; // 接收新连接
client.configureBlocking(false) ;// 配置为非阻塞
ByteBuffer outBuf = ByteBuffer.allocateDirect(1024) ; //
Socket socket=client.socket();
ServerSocket ssocket=server.socket();
// 向缓冲区中设置内容
outBuf.put(("当前的时间为:" + new Date()+"\r\n").getBytes());
outBuf.put(("客户端端口: "+socket.getPort()+"\r\n").getBytes()) ;
outBuf.put(("本地端口(当前客户端所连接的对应服务端端口): "+socket.getLocalPort()).getBytes()) ;
outBuf.flip() ;
client.write(outBuf) ; // 输出内容
client.close() ; // 关闭
}
}
selectedKeys.clear() ; // 清除全部的key
}
}
};
关键字词:java,Selector