关于多个SocketChannel注册一个Selector selector channel

虽然我们可以自己处理每一个Socket事件,比如读写数据,不过更常规的方式是注册一个选择器。这个选择器侦听着数据的变化事件。每个注册的通道都有自己的SelectionKey,用这个可以区分到底是哪个通道产生了事件。看代码
关于多个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;  }

  

爱华网本文地址 » http://www.aihuau.com/a/25101013/182213.html

更多阅读

Word中怎么快速选中并组合多个文本框图形 文本框选中事件

Word中怎么快速选中并组合多个文本框图形——简介在使用word制作流程图的时候往往会使用到较多的文本框,文本框绘制完成后需要将一部分或者所有的文本框进行组合。但是一个一个的去点击文本框效率很低,而且还会遇到马上所有文本框就要

ie浏览器一个窗口多个标签 ie安全警告怎么关闭

ie浏览器一个窗口多个标签——简介重新安装了浏览器结果弱保报了,不支持以窗口多标签,郁闷那就下手解决吧~IE浏览器如何一个窗口打开多个标签。ie浏览器一个窗口多个标签——工具/原料IE浏览器 win7操作系统ie浏览器一个窗口多个标签

如何连续注册多个QQ号码 qq申请号码免费注册

如何连续注册多个QQ号码——简介在注册QQ马甲的时候,有一个规律就是,同一个电脑同一个ip,第一次注册,不需要验证码,第二次注册需要填写验证码,第三次注册的时候就是手机短信验证了。这样你一天之内只能注册3个QQ号,对于需要很多QQ号码的人

怎么合并多个PDF文件 精 怎么合并多个pdf文件

相信大家在论坛或者其他地方下载PDF资料的时候会遇到这样的情况,本来是一本完整的书籍但是却被分成了好几个部分,下载下来以后我们肯定想把这几个部分合并成一个PDF文件,这样管理和阅读都比较方便,那么废话不多说,今天我就来教大家如何

声明:《关于多个SocketChannel注册一个Selector selector channel》为网友随性似风分享!如侵犯到您的合法权益请联系我们删除