java选择器

来源:互联网 发布:火狐浏览器 mac 编辑:程序博客网 时间:2024/06/06 00:58
 转载文章:http://zhidao.baidu.com/link?url=fufMW1RCjKpZ9qRsy43mb4QPmvOxiUA2esUVupZnbuKeh7KbT4lVBq-yo23HGMt3fuOCNTDje2omX6SOAbEvLq在用nio通讯的过程我用以下情景给你模拟: 1. 学校(ServerSocketChannel) 2。 学校教务处(Selector) 3。 老师 (ServerSocket ) 4。 学生 (SocketChannel) 5。 员工号/学生号(SelectionKey) 学校:相当于我们的网络应用程序,一旦学校启动,学校就不停止,不断运行,直到学期结束; 要启动学校就要: ServerSocketChannel ssc= ServerSocketChannel.open();//新建NIO通道 ssc.configureBlocking( false );//使通道为非阻塞 老师: 相当于服务端的Socket,一个老师对应多个学生,多个学生向老师请教,老师会一一做出回答。而学校要正常运营当然当不了老师,所以在开学之前,必须先聘请专业的老师来任教 ServerSocket ss = ssc.socket()();//创建基于NIO通道的socket()连接 //新建socket()通道的端口 ss.bind(new InetSocketAddress("127.0.0.1",SERVERPORT)); 学校教务处: 老师都有了,但是需要有部门对老师和学生做统一的管理, 如果你去一个学校找一个人,实在是找不到,你可以告诉教务处,那个人是学生还是老师,是老师的话员工编号老师姓名的多少,是学生的话学号和姓名是多少,教务处就会找到告诉你他在哪里。 //将NIO通道选绑定到择器,当然绑定后分配的主键为skey SelectionKey skey = ssc.register( select()or, SelectionKey.OP_ACCEPT ); ssc注册了选择器后,其下的老师ServerSocket就也入了员工册了。所以老师的编号就是skey 学生: 学校、老师、教务处都有了,现在就可以招生了! 如果有学生来报名: while(true){//除非学期结束,否则一直等待学生 int num = select()or.select()();//获取通道内是否有选择器的关心事件, 意思是有多少学生报告 if(num<1){continue; } Set selectedKeys = selector.selectedKeys();//获取通道内关心事件的集合 ,这里的集合就是老师和学生的编号集合,如果key是学生的,那就是老学生来问问题,如果key是老师的,那就是招生办的老师带着一个新生来注册 Iterator it = selectedKeys.iterator(); while (it.hasNext()) {//遍历每个key (学生key和老师key) ....... } ..... } 既然有学生来报告,那有两种可能,一种是招生老师带着新生来注册的,一种是老生来问问题的。 上面的while (it.hasNext()) 体可以这样写: while (it.hasNext()) {//遍历每个事件 try{ SelectionKey key = (SelectionKey)it.next(); //先得到这个学生的编号key //判断是新生报道还是老生问问题 if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) { //这是招生老师的Key说明是新生注册,先找到招生老师,再由招生老师找到新生,就可以给新生注册学号了 ServerSocketChannel serverChanel = (ServerSocketChannel)key.channel(); //通过key把学校和老师找到了 //从serverSocketChannel中创建出与客户端的连接socketChannel 有了老师才有学生,不可能我教计算机的,来一个想学李小龙的都让他报名 SocketChannel sc = serverChanel.accept()(); //学生报名成功 sc.configureBlocking( false ); // 把新连接注册到选择器,新生被接收后给注册个新学号 SelectionKey newKey = sc.register( selector搜索, SelectionKey.OP_READ ); //注册学号成功,并分配学生的权限 it.remove()(); //新生注册任务完成了,呵呵 System.out.println( "Got connection from "+sc ); }else //读客户端数据的事件,此时有客户端发数据过来,客户端事件 这是老学生来问问题了。 if((key.readyOps() & SelectionKey.OP_READ)== SelectionKey.OP_READ){ // 读取数据 ,接受学生的问题 SocketChannel sc = (SocketChannel)key.channel(); //通过学号知道是谁问的问题 //下面接受问题 int bytesEchoed = 0; while((bytesEchoed = sc.read(echoBuffer))> 0){ System.out.println("bytesEchoed:"+bytesEchoed); } echoBuffer.flip(); System.out.println("limet:"+echoBuffer.limit()); byte [] content = new byte[echoBuffer.limit()]; echoBuffer.get(content); String result=new String(content); doPost(result,sc); //相应老师会去做回答的,细节自己去写吧 echoBuffer.clear(); it.remove()(); //任务完成,记得上面也是一样,要remove()掉,否则下一次又来一次任务,就死循环了 } }catch(Exception e){} } }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 高一英语基础差怎么办 老师教育学生学生跑出教室怎么办 研究生课题难出论文怎么办 一审过了上诉期怎么办 民事判决赔偿不给钱怎么办 民事申诉期过了怎么办 过了两年申诉期怎么办 微快递下单不能定位怎么办 网上打字兼职被骗了怎么办 微信银行卡转错怎么办 在支付宝被诈骗怎么办 发现被骗了报警不理怎么办 投稿投错了网站怎么办 六个月宝宝吃辅食便秘怎么办 六个月宝宝加辅食后便秘怎么办 婴儿6个月便秘怎么办 7个月的孩子便秘怎么办 四个月宝宝喜欢吃手怎么办 博瑞智教育是上当了怎么办 我43岁记忆力差怎么办 艾灸灸出的湿疹怎么办 饭店合同到期房东不租怎么办 极端暴力控制不住自己怎么办 苹果已停止访问该网页怎么办 qq登陆后隐藏了怎么办 易班密码忘记了怎么办 老师上课讲错了怎么办 专升本差了一分怎么办 登录不上学信网怎么办 steam被好友删了怎么办 护士继续教育学分证丢了怎么办 护士证到期未延续注册怎么办 学籍和户口不在一起小升初怎么办 定了酒店不能退怎么办 去哪儿网酒店不允许取消怎么办 快递寄送身份证扣海关怎么办 7岁龋齿烂到牙根怎么办 法院判完对方说没钱怎么办 初中填完志愿后怎么办 上海小学借读一年级没有学籍怎么办 学历不高的我该怎么办