版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/isaiah282485068/article/details/88293721
TCP编程
基于TCP的非阻塞模式
UDP编程
基于UCP的非阻塞模式
范例:
服务端:
public class UDPServer {
public static void main(String[] args){
try (
// 1 获取通道
DatagramChannel datagramChannel = DatagramChannel.open()) {
// 2 设置非阻塞模式
datagramChannel.configureBlocking(false);
// 3 绑定端口
datagramChannel.bind(new InetSocketAddress(7777));
// 4 获取选择器
Selector selector = Selector.open();
// 5 将选择器注册到通道上
datagramChannel.register(selector, SelectionKey.OP_READ);
// 6 轮询式的获取选择器上已经“准备读取”的事件
while (selector.select() > 0){
// 7 获取当前选择器上所有注册的“选择键”
Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
while (iter.hasNext()){
// 8 获取准备“读取”的事件
SelectionKey key = iter.next();
// 9 判断具体是什么事
if (key.isReadable()){
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
// 10 读取数据
datagramChannel.receive(byteBuffer);
byteBuffer.flip();
System.out.println(new String(byteBuffer.array(), 0, byteBuffer.limit()));
byteBuffer.clear();
}
}
// 取消选择键
iter.remove();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
客户端:
public class UDPClient {
public static void main(String[] args){
try (
// 1 获取通道
DatagramChannel datagramChannel = DatagramChannel.open()) {
// 2 设置为非阻塞模式
datagramChannel.configureBlocking(false);
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
String content = scanner.next();
byteBuffer.put((LocalDateTime.now().toString() + ":" + content).getBytes());
byteBuffer.flip();
// 3 发送数据
datagramChannel.send(byteBuffer, new InetSocketAddress("127.0.0.1", 7777));
byteBuffer.clear();
}
}catch (Exception e){
e.printStackTrace();
}
}
}