DatagramChannel是一个接受UDP包的通道,不保证数据传输的可靠性
1.服务端server
package com.netty.redis.zookeeper.netty.unit1.oneday;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Iterator;
/**
* @Description: DatagramChannel传输数据
* DatagramChannel是一个接受UDP包的通道,不保证数据传输的可靠性
* @ClassName: DatagramChannelServer
* @Author zhaomx
* @Version 1.0
* @Date 2021-07-13 09:51
*/
@Slf4j
public class DatagramChannelServer {
public static void main(String[] args) throws IOException {
//打开数据报通道
DatagramChannel channel = DatagramChannel.open();
//1.使用非阻塞通道
channel.configureBlocking(false);
//2.将通道的套接字绑定到本地地址
channel.bind(new InetSocketAddress("127.0.0.1", 9999));
//3.使用Selector监听通道的读就绪SelectionKey.OP_READ
//Selector是实现nio多路复用的核心
Selector selector = Selector.open();
//3.1将DatagramChannel注册到Selector上
channel.register(selector, SelectionKey.OP_READ);
while (selector.select() > 0) {
Iterator<SelectionKey> selectionKeys = selector.selectedKeys().iterator();
while (selectionKeys.hasNext()) {
SelectionKey selectionKey = selectionKeys.next();
if (selectionKey.isReadable()) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
//4.接受通道中数据
channel.receive(buffer);
buffer.flip();
System.out.println(new String(buffer.array(), 0, buffer.limit()));
buffer.clear();
}
selectionKeys.remove();
}
}
}
}
2.客户端client
package com.netty.redis.zookeeper.netty.unit1.oneday;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* @Description: DatagramChannelClient客户端发送数据
* @ClassName: DatagramChannelClient
* @Author zhaomx
* @Version 1.0
* @Date 2021-07-13 10:16
*/
@Slf4j
public class DatagramChannelClient {
public static void main(String[] args) throws IOException {
//打开数据报通道
DatagramChannel channel = DatagramChannel.open();
//1.使用非阻塞通道
channel.configureBlocking(false);
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
Scanner scanner = new Scanner(System.in);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while (scanner.hasNext()) {
String line = scanner.next();
byteBuffer.put((format.format(new Date()) + ":" + line).getBytes());
//2.将Buffer从写模式变为可读模式
byteBuffer.flip();
//3.使用send直接发送数据
channel.send(byteBuffer, new InetSocketAddress("127.0.0.1", 9999));
byteBuffer.clear();
}
channel.close();
}
}
借鉴链接:http://www.itxm.cn/post/16633.html