在我的专栏Java NIO中,已经简单的完成了对Java NIO的基本学习,本篇将完成一个Server - Client的完整示例,演示一下学习成果,对Java NIO在网络编程中的应用做一个总结
服务端:
package com.leolee.nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
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.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* @ClassName NIOServerTest
* @Description: 客户端服务端完整测试——模拟简单群聊,服务端单端口监听
* @Author LeoLee
* @Date 2020/9/23
* @Version V1.0
**/
public class NIOServerTest {
//该map维护通道的唯一标识和通道对象本身
private Map<String, SocketChannel> clientChannelMap = new HashMap<>();
public void buildServer () throws IOException {
//服务端初始化
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);//非阻塞模式(异步模式)
ServerSocket serverSocket = serverSocketChannel.socket();
serverSocket.bind(new InetSocketAddress("127.0.0.1", 8899));
//构建selector
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
//开始阻塞代码,进行请求监听
while (true) {
try {
//开始监听selector中“感兴趣事件”的通道
int number = selector.select();
Set<SelectionKey> selectionKeys = selector.selectedKeys();
selectionKeys.forEach(selectionKey -> {
//对应客户端的Channel,服务端通过此channel和客户端联系
final SocketChannel clientSocketChannel;
//开始判断SelectionKey的事件类型
if (selectionKey.isAcceptable()) {//客户端请求服务端,建立连接请求
//获取当前事件发生的通道,ServerSocketChannel的作用就是帮助服务端和客户端建立连接
ServerSocketChannel serverSocke