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

来源:互联网 发布:阿里云电话人工服务 编辑:程序博客网 时间:2024/05/01 10:25

发送端

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();//取消选择键}}


原创粉丝点击