JAVA NIO selector

服务器端

import java.net.InetSocketAddress;  
import java.nio.ByteBuffer;  
import java.nio.channels.SelectionKey;  
import java.nio.channels.Selector;  
import java.nio.channels.ServerSocketChannel;  
import java.nio.channels.SocketChannel;  
import java.util.Iterator;  

public class NIOServer {  
	public static void main(String[] args) throws Exception {  
		Selector selector=Selector.open();
		
		ServerSocketChannel serverchannel=ServerSocketChannel.open();
		serverchannel.configureBlocking(false);//设置为非阻塞 (必须)
		serverchannel.socket().bind(new InetSocketAddress(8998));
		
		serverchannel.register(selector, SelectionKey.OP_ACCEPT);//向监听器注册一个Accept事件
		
        while(selector.select()>0) {
        	Iterator ite=selector.selectedKeys().iterator();//获取监听器的事件
        	while(ite.hasNext()) {
        		SelectionKey key=(SelectionKey) ite.next();
        		if(key.isAcceptable()) {
        			ServerSocketChannel serverchan=(ServerSocketChannel) key.channel();
        			SocketChannel sockchan=serverchan.accept();//接受
        			sockchan.configureBlocking(false);
        			sockchan.write(ByteBuffer.wrap(new String("我是服务器端第一次见面").getBytes()));  
					// 在客户端 连接成功之后,为了可以接收到客户端的信息,需要给通道设置读的权限  
        			sockchan.register(selector, SelectionKey.OP_READ);  
        		}else if(key.isReadable()) {
        			SocketChannel channel = (SocketChannel) key.channel();  
					ByteBuffer buffer = ByteBuffer.allocate(1024);  
					channel.read(buffer);  
					byte[] data = buffer.array();  
					System.out.println(new String(data));  
					channel.register(selector, SelectionKey.OP_WRITE);  
        		}else if(key.isWritable()) {
					SocketChannel channel = (SocketChannel) key.channel();  
					ByteBuffer outBuffer = ByteBuffer.wrap("我是服务器端不是第一次见面".getBytes());
					channel.write(outBuffer);  
					channel.register(selector, SelectionKey.OP_READ);  
				}
        		ite.remove();//移出当前处理的事件
        	}
        }

	}  
} 



客户端

import java.net.InetSocketAddress;  
import java.nio.ByteBuffer;  
import java.nio.channels.SelectionKey;  
import java.nio.channels.Selector;  
import java.nio.channels.SocketChannel;  
import java.util.Iterator;  

public class NIOClient {  
	public static void main(String[] args) throws Exception {  
		Selector selector = Selector.open();

		SocketChannel channel = SocketChannel.open(); // 设置通道为非阻塞  
		channel.configureBlocking(false); // 获得一个通道管理器  	
		// 用channel.finishConnect();才能完成连接  
		channel.connect(new InetSocketAddress("127.0.0.1",8998));  

		// 将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_CONNECT事件。  
		channel.register(selector, SelectionKey.OP_CONNECT);  

		while (selector.select()>0) {  

			Iterator ite = selector.selectedKeys().iterator();  
			while (ite.hasNext()) {  
				SelectionKey key = (SelectionKey) ite.next(); // 删除已选的key,以防重复处理  
			
				if (key.isConnectable()) { 
					SocketChannel channels = (SocketChannel) key.channel(); // 如果正在连接,则完成连接 
					if (channels.isConnectionPending()) {  //如果已完成3次握手 
						channels.finishConnect();  //那么完成连接,建立通道
					} // 设置成非阻塞  
					channels.configureBlocking(false);  
					// 在这里可以给服务端发送信息哦  
					channels.write(ByteBuffer.wrap(new String("我是客户端哦第一次见面").getBytes()));  
					// 在和服务端连接成功之后,为了可以接收到服务端的信息,需要给通道设置读的权限。  
					channels.register(selector, SelectionKey.OP_READ); // 获得了可读的事件  
				} else if (key.isReadable()) {  
					SocketChannel channels = (SocketChannel) key.channel();  
					// 穿件读取的缓冲区  
					ByteBuffer buffer = ByteBuffer.allocate(1024);  
					channels.read(buffer);  
					byte[] data = buffer.array();  
					System.out.println(new String(data));  
					channels.register(selector, SelectionKey.OP_WRITE);
				}  else if(key.isWritable()) {
					SocketChannel channels = (SocketChannel) key.channel();  
					ByteBuffer outBuffer = ByteBuffer.wrap("我是客户端不是第一次见面".getBytes());  
					channels.write(outBuffer);  
					channels.register(selector, SelectionKey.OP_READ);  
				}
				ite.remove(); // 移出当前处理的事件
			}  
		}  
	}  
}  
具体教程可看 http://ifeve.com/selectors/  ,http://ifeve.com/socket-channel/ ,http://ifeve.com/server-socket-channel/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gentle+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值