使用Channel、Buffer、Selector完成网络通信--非阻塞(二)

发送端

public void send() throws IOException{
	DatagramChannel dc = DatagramChannel.open();//获取通道
	dc.configureBlocking(false);//切换非阻塞模式
	ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
	Scanner scanner = new Scanner(System.in);
	while(scanner.hasNext()){
		String data = scanner.next();
		byteBuffer.put((LocalDateTime.now().toString()+"\n"+data).getBytes());
		byteBuffer.flip();
		dc.send(byteBuffer,new InetSocketAddress("127.0.0.1",8989));
		byteBuffer.clear();
	}
	dc.close();
}

接收端

public void receive() throws IOException{
	DatagramChannel dc = DatagramChannel.open(); //获取通道
	dc.configureBlocking(false); //切换非阻塞模式
	dc.bind(new InetSocketAddress(8989)); //绑定端口
	Selector selector =	Selector.open(); //获取选择器
	dc.register(selector,SelectionKey.OP_READ); //将通道注册到选择器中
	while(selector.select() > 0){ //轮询获取选择器上准备就绪的状态
		Iterator<SelectionKey> it = selector.selectedKeys().iterator(); //获取选择器中所有注册的选择键
		while(it.hasNext()){
			SelectionKey selectionKey =	it.next(); //获取就绪的事件
			if(selectionKey.isReadable()){ //判断是否为读取事件、然后读取
				ByteBuffer buffer = ByteBuffer.allocate(1024);
				dc.receive(buffer);
				buffer.flip();
				System.out.println(new String(buffer.array(),0,buffer.limit()));
				buffer.clear();
			}
		}
		it.remove();//取消选择键
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值