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客户端测试:

总结:

posted on 2017-05-23 15:40  祥昊  阅读(1122)  评论(0)    收藏  举报

导航