关于多个SocketChannel注册一个Selector selector channel
public class SocketChannelSelector {public static SocketChannel createSocketChannel(StringhostName, int port)throws IOException {SocketChannel sChannel = SocketChannel.open();sChannel.configureBlocking(false);sChannel.connect(new InetSocketAddress(hostName, port));return sChannel;}// 2个连接注册的选择器关键字static SelectionKey key1;static SelectionKey key2;public static void main(String[] args) {// 1个选择器,注册2个Socket 通道Selector selector = null;try {// 创建选择器selector = Selector.open();// 创建2个通道SocketChannel sChannel1 = createSocketChannel("163.net",25);SocketChannel sChannel2 = createSocketChannel("mail.csdn.net",25);// 注册选择器,侦听所有的事件//channel注册的返回的key唯一。key1 = sChannel1.register(selector,sChannel1.validOps());key2 = sChannel2.register(selector,sChannel1.validOps());} catch (IOException e) {}// 青年人网站提示等待事件的循环while (true) {try {// 等待selector.select();} catch (IOException e) {break;}// 所有事件列表Iterator<SelectionKey> it =selector.selectedKeys().iterator();// 处理每一个事件while (it.hasNext()) {// 得到关键字SelectionKey selKey = it.next();// 删除已经处理的关键字it.remove();try {// 处理事件processSelectionKey(selKey); } catch (IOException e) { // 处理异常 selKey.cancel(); } } } } public static void processSelectionKey(SelectionKey selKey)throws IOException { ByteBuffer buf = ByteBuffer.allocateDirect(1024); // 确认连接正常 if (selKey.isValid() &&selKey.isConnectable()) { // 得到通道 SocketChannel sChannel = (SocketChannel)selKey.channel(); // 是否连接完毕? boolean success = sChannel.finishConnect(); if (!success) { // 异常 selKey.cancel(); } } // 如果可以读取数据 if (selKey.isValid() &&selKey.isReadable()) { // 得到通道 SocketChannel sChannel = (SocketChannel)selKey.channel(); if (sChannel.read(buf) > 0) { // 转到最开始 buf.flip(); while (buf.remaining() > 0) { System.out.print((char) buf.get()); } // 也可以转化为字符串,不过需要借助第三个变量了。 // buf.get(buff, 0, numBytesRead); // System.out.println(new String(buff, 0, numBytesRead,"UTF-8")); // 复位,清空 buf.clear(); } } // 如果可以写入数据 if (selKey.isValid() &&selKey.isWritable()) { // 得到通道 SocketChannel sChannel = (SocketChannel)selKey.channel(); // 区分2个侦听器的关键字 // 我这里只写一次数据。 if (!s1 &&key1.equals(selKey)) { System.out.println("channel1 write data.."); buf.clear(); buf.put("HELO localhostn".getBytes()); buf.flip(); sChannel.write(buf); s1 = true; } else if (!s2 &&key2.equals(selKey)) { System.out.println("channel2 write data.."); buf.clear(); buf.put("HELO localhostn".getBytes()); buf.flip(); sChannel.write(buf); s2 = true; } } } // 判断已经写过数据的标志 static boolean s1 = false; static boolean s2 = false; }
更多阅读
怎样申请qq号,免费申请多个QQ号不要手机验证 qq靓号免费申请验证码
怎样申请qq号,免费申请多个QQ号不要手机验证——简介现在QQ是互联网的朋友必不可少的聊天软件了,许多慢慢长大的小朋友也开始申请QQ了,现在我对于新朋友们申请QQ的操作用图来解释给大家看,而且腾讯现在聪明了,一个IP最多只能注册几个,注册
Word中怎么快速选中并组合多个文本框图形 文本框选中事件
Word中怎么快速选中并组合多个文本框图形——简介在使用word制作流程图的时候往往会使用到较多的文本框,文本框绘制完成后需要将一部分或者所有的文本框进行组合。但是一个一个的去点击文本框效率很低,而且还会遇到马上所有文本框就要
ie浏览器一个窗口多个标签 ie安全警告怎么关闭
ie浏览器一个窗口多个标签——简介重新安装了浏览器结果弱保报了,不支持以窗口多标签,郁闷那就下手解决吧~IE浏览器如何一个窗口打开多个标签。ie浏览器一个窗口多个标签——工具/原料IE浏览器 win7操作系统ie浏览器一个窗口多个标签
如何连续注册多个QQ号码 qq申请号码免费注册
如何连续注册多个QQ号码——简介在注册QQ马甲的时候,有一个规律就是,同一个电脑同一个ip,第一次注册,不需要验证码,第二次注册需要填写验证码,第三次注册的时候就是手机短信验证了。这样你一天之内只能注册3个QQ号,对于需要很多QQ号码的人
怎么合并多个PDF文件 精 怎么合并多个pdf文件
相信大家在论坛或者其他地方下载PDF资料的时候会遇到这样的情况,本来是一本完整的书籍但是却被分成了好几个部分,下载下来以后我们肯定想把这几个部分合并成一个PDF文件,这样管理和阅读都比较方便,那么废话不多说,今天我就来教大家如何