java ServerSocketChannel的使用
1、
1 package cn.kongxh.nio5; 2 3 import java.net.InetSocketAddress ; 4 import java.net.ServerSocket ; 5 import java.util.Set ; 6 import java.util.Iterator ; 7 import java.util.Date ; 8 import java.nio.channels.ServerSocketChannel ; 9 import java.nio.ByteBuffer ; 10 import java.nio.channels.SocketChannel ; 11 import java.nio.channels.Selector ; 12 import java.nio.channels.SelectionKey ; 13 public class DateServer{ 14 public static void main(String args[]) throws Exception { 15 int ports[] = {8000,8001,8002,8003,8005,8006} ; // 表示五个监听端口 16 Selector selector = Selector.open() ; // 通过open()方法找到Selector Selector比ServerSocket在高一级 17 for(int i=0;i<ports.length;i++){ 18 ServerSocketChannel initSer = null ; 19 initSer = ServerSocketChannel.open() ; // 打开服务器的通道 20 initSer.configureBlocking(false) ; // 服务器配置为非阻塞 21 ServerSocket initSock = initSer.socket() ; 22 InetSocketAddress address = null ; 23 address = new InetSocketAddress(ports[i]) ; // 实例化绑定地址 24 initSock.bind(address) ; // 进行服务的绑定 25 initSer.register(selector,SelectionKey.OP_ACCEPT) ; // 等待连接 26 System.out.println("服务器运行,在" + ports[i] + "端口监听。") ; 27 } 28 // 要接收全部生成的key,并通过连接进行判断是否获取客户端的输出 29 int keysAdd = 0 ; 30 while((keysAdd=selector.select())>0){ // 选择一组键,并且相应的通道已经准备就绪 selector.select()在此阻塞等待请求到来 31 Set<SelectionKey> selectedKeys = selector.selectedKeys() ;// 取出全部生成的key 32 Iterator<SelectionKey> iter = selectedKeys.iterator() ; 33 while(iter.hasNext()){ 34 SelectionKey key = iter.next() ; // 取出每一个key 35 if(key.isAcceptable()){ 36 ServerSocketChannel server = (ServerSocketChannel)key.channel() ; 37 SocketChannel client = server.accept() ; // 接收新连接 38 client.configureBlocking(false) ;// 配置为非阻塞 39 ByteBuffer outBuf = ByteBuffer.allocateDirect(1024) ; // 40 outBuf.put(("当前的时间为:" + new Date()).getBytes()) ; // 向缓冲区中设置内容 41 outBuf.flip() ; 42 client.write(outBuf) ; // 输出内容 43 client.close() ; // 关闭 44 } 45 } 46 selectedKeys.clear() ; // 清楚全部的key 47 } 48 System.out.println("==============================") ; 49 } 50 }
2客户端测试:
总结: