java nio 使用例子

服务端:

//新建NIO通道
		ServerSocketChannel server = ServerSocketChannel.open();
		//使通道为非阻塞
		server.configureBlocking(false);
		//创建基于NIO通道的socket连接
		ServerSocket ss = server.socket();
		//新建socket通道的端口
		ss.bind(new InetSocketAddress(9000));
		//将NIO通道绑定到选择器
		Selector selector = Selector.open();
		server.register(selector, SelectionKey.OP_ACCEPT);
		System.out.println("--------开始监听-----------");
		while (true) {
			//获取通道内是否有选择器的关心事件
			int num = selector.select();
			//如果小于1,停止此次循环,进行下一个循环
			if (num < 1) {
				continue;
			}
			//获取通道内关心事件的集合
			Set selectedKeys = selector.selectedKeys();
			Iterator iterator = selectedKeys.iterator();
			while (iterator.hasNext()) {
				SelectionKey key = (SelectionKey) iterator.next();
				//移走此次事件
				iterator.remove();

				if (key.isAcceptable()) {
					//获取对应的SocketChannel
					SocketChannel client = server.accept();
					System.out.println("Accepted connection from " + client);
					//使此通道为非阻塞
					client.configureBlocking(false);

					//在此通道上注册事件
					client.register(key.selector(), SelectionKey.OP_WRITE);

				} else if (key.isWritable()) {
					//获取此通道的SocketChannel
					SocketChannel client = (SocketChannel) key.channel();
					//将数组data的大小定义为ByteBuffer缓冲区的大小
					ByteBuffer source = ByteBuffer.wrap(new byte[] { 12, 12, 12 });
					client.write(source);
					// 改变关注状态
					key.interestOps(SelectionKey.OP_READ);
					//					client.register(selector,  
					//	                        SelectionKey.OP_READ);
				//	client.close();
				} else if (key.isReadable()) {
					SocketChannel channel = (SocketChannel) key.channel();
					// 得到附件,就是上面SocketChannel进行register的时候的第三个参数,可为随意Object
					//ByteBuffer buffer = (ByteBuffer) key.attachment();
					ByteBuffer buffer = ByteBuffer.allocate(10);
					// 读数据 这里就简单写一下,实际上应该还是循环读取到读不出来为止的
					channel.read(buffer);
					// 改变自身关注事件,可以用位或操作|组合时间
					//key.interestOps(SelectionKey.OP_WRITE);
					System.out.println(buffer.toString());
					channel.close();
				}
			}

		}
客户端:

		//建立到服务端的链接
		  SocketAddress address = new InetSocketAddress("127.0.0.1", 9000);
		  //创建管道socket
		  SocketChannel client = SocketChannel.open();
		  client.configureBlocking(false);//设置为非阻塞状态
		  //注册监听事件
		  Selector selector = Selector.open();
		  client.register(selector, SelectionKey.OP_CONNECT);
		  //连接服务器
		  client.connect(address);
		  while(true)
		  {
			  int re= selector.select();//等待注册的事件
			  if(re<1)
				  continue;
			  Iterator iterator =	selector.keys().iterator();//获取注册的事件集合
			  
			  while(iterator.hasNext())
			  {
				  SelectionKey selectionKey =	(SelectionKey) iterator.next();
				 
				  if(selectionKey.isConnectable())
				  {
					  if(client.finishConnect())
					  {
					  System.out.println("-----连接成功----");
					  SocketChannel channel =	(SocketChannel) selectionKey.channel();
					 
					  channel.register(selectionKey.selector(), SelectionKey.OP_READ);  
					  }
					//  selectionKey.interestOps(SelectionKey.OP_READ);
				  }
				  else if(selectionKey.isReadable())
				  {
					  SocketChannel channel =	(SocketChannel) selectionKey.channel();
					  //创建静态的缓冲区
					  ByteBuffer buffer = ByteBuffer.allocate(10);

					  //读取数据,到buffer中
					  channel.read(buffer);
					  System.out.println("---------"+"客户端收到消息"+buffer.toString()+"--------");
					  selectionKey.interestOps(SelectionKey.OP_WRITE);
				  }
				  else if(selectionKey.isWritable())
				  {
					  SocketChannel channel =	(SocketChannel) selectionKey.channel();
					ByteBuffer  buffer = ByteBuffer.wrap(new byte[]{12,123});
					  channel.write(buffer);
					  System.out.println("---------"+"客户端发送消息"+buffer.toString()+"--------");
					  channel.close();
				  }
				//  iterator.remove();//移除当前处理事件
			  }
		  }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值