Products
GG网络技术分享 2026-04-17 07:28 0

先使用传统的Socket方式, 实现一个客户端和服务端,且看两者的通信过程,牛逼。。
java NIO 非阻塞I/O编程.NIO是New Input/Output的英文缩写,也被大多数用户认为是Non-blocking I/O,意为非阻塞IO..,我给跪了。
这里补充一下,也是图中忽略的部分,就是关于worker线程池的初始化时机问题.在第六讲中,我们已经知道使用Selector的几个关键点,所以这里我们也重点关注一下,这些点在Netty中是如何使用的。
Socket socket = new Socket;
BufferedReader in = new BufferedReader);
PrintWriter out = new PrintWriter;
String message;
BufferedReader br = new BufferedReader);
while {
System.out.print;
message = br.readLine;
out.println;
String response = in.readLine;
System.out.println;
}
一边, 如图所示,如上面缓冲区所讲,在链路(TCP)上,数据以byte二进制的形式进行传输,但是在NIO接收和发送的内部流程中,使用Buffer来进行存放。 差点意思。 我调用NIO的write写入Buffer, NIO自动会将Buffer中的数据,转换成链路上的byte进行传输,这个我们无需担心。
在Buffer中,提供了对数据的结构化访问、清空、重置以及维护读写位置等信息。哎呀妈呀,写起来好麻烦啊!
BIO:Block I/O,即同步并阻塞的IO;BIO就是传统的java.io包下的代码实现.NIO:New IO:同步非阻塞的IO,jdk1.4及以上版本提供。
// 创建 Selector
Selector selector = Selector.open;
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open;
serverSocketChannel.bind);
serverSocketChannel.configureBlocking; // 设置非阻塞模式很重要!重要的事情说三遍!// 注册Accept事件到Selector上。selector监听ServerSocketChannel上的连接事件。selector要监听ServerSocketChannel上的accept事件才行啊!不然怎么知道有客户端来连接呢?selector._ACCEPT; // 这个地方写的有点奇怪了啊...应该用 SelectionKey 的常量才对。但是凑合着看吧...哎...BufferedReader br = new BufferedReader); // 等待客户端连接while { // 无限循环等待新的连接SelectionKey selectedKeys = selector.select; // select方法会阻塞直到有事件发生Iterator keyIterator = selectedKeys.iterator; while ) { SelectionKey key = keyIterator.next; if .isAcceptable) { // 如果是Accept事件Serverchannel channel = key.channel; SocketChannel client = channel.accept;// accept方法会创建一个新的SocketChannel用于与客户端通信clientchannelchannelchannelchannelchannelconfigureBlocking;// 将新的SocketChannel注册到Selector上并监听READ事件selector._READ;// 在控制台打印客户端连接的信息System.println); } else if .isReadable) { SocketChannel client = key.channel; ByteBuffer buffer = ByteBufferallocateDirect; int bytesRead = clientread;// 读取数据if { bufferflip;// 将Buffer翻转过来准备读取数据byte data = new byte; bufferget;// 将Buffer中的数据复制到字节数组中System.println);// 回复客户端消息 System.print;// 从控制台读取回复String response=brresponseBufferput.toString); responseBufferflip;// 将Buffer翻转过来准备写入数据clientwriteresponseBuffer); } } keyIteratorremove;} }
主要原因是是对话, 所以要使用while来读取客户端发送的每行数据,然后再从服务端键盘输入回复客户端。接着我们来实现一个客户端,与服务端进行数据交互,栓Q!。
绝了... NIO引入了Selector, 它是一种高效的多路复用器,一个线程可以管理多个通道,而非I/O中一个线程只能读取一个流的数据,这样线程就不会在交互空闲时被占用。这简直太棒了!想象一下你一边和好几个朋友聊天…不用一个个轮流等!
我持保留意见... 这时候,又启动了客户端2连接服务端…然后礼貌性的和服务端打了个招呼。我觉得这个场景好熟悉…像极了我跟两个女朋友一边聊天…
产品名称价格功能Netty免费高性能网络应用框架Min 出岔子。 io免费分布式对象存储服务Redis付费/开源内存数据库
| 排名 | 产品名称 | 评分 |
|---|---|---|
| 1 | Netty | 4.8 |
| 2 | Spring Boot | 4.5 |
| 3 | Dubbo | 4.2 |
NIIIIIIIIIIIIIIIII . NIO有同步阻塞和同步非阻塞两种模式,一般讲的是同步非阻塞,服务器实现模式为一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。.NIO有同步阻塞和同步非阻塞两种模式,一般讲的是同步非阻塞,服务器实现模式为一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮..... ... .... ... . ..,你我共勉。
Demand feedback