网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
while (true){
try {
//等待新连接接入,并获取客户端socket连接
Socket socket= SERVER.accept();
System.out.println("新客户端接入啦");
//处理新连接
new ClientHandler(socket).doStart();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
public static void main(String[] args) throws Exception{
Server server=new Server(8001);
server.doStart();
System.out.println("服务端已启动.");
}
}
#### 1.1.2 服务端消息处理类
import java.io.InputStream;
import java.net.Socket;
/**
-
客户端消息处理
*/
public class ClientHandler {private Socket socket;
/**
- 处理每个新连接的client 端的socket .
- @param socket
*/
public ClientHandler(Socket socket) {
this.socket=socket;
}
/**
- 异步处理获取客户端消息
- @throws Exception
*/
public void doStart() {
//异步线程处理客户端消息读取不阻塞主线程接收新的客户端连接
new Thread(()->{
try {
//读取客户端输入流
InputStream inputStream= this.socket.getInputStream();
while (true) {
//指定总结长度读取
byte[] maxData = new byte[1024];
int len;
//一直读取消息
while ((len = inputStream.read(maxData)) != -1) {
String message = new String(maxData, 0, len);
System.out.println("客户端传来消息: " + message);
//回执消息
socket.getOutputStream().write(maxData);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
### 1.2 客户端连接或直接telnet命令连接
#### 1.2.1 客户端 socket 连接
import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.TimeUnit;
/**
-
client
*/
public class Client {private Socket socket;
public void start(){
new Thread(()->{
try {
//连接指定端口
socket=new Socket(“127.0.0.1”,8001);
int i=0;
while (true) {
socket.getOutputStream().write((“你好,我是客户端”+i++).getBytes());
TimeUnit.SECONDS.sleep(1);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}public static void main(String[] args)throws Exception {
System.out.println(“客户端启动了”);
new Client().start();
}
}
#### 1.2.2 telnet 连接方式
telnet 127.0.0.1 8001
![telnet 命令方式发送消息](https://img-blog.csdnimg.cn/2021053017263678.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5mYW5nbGluY2Zs,size_16,color_FFFFFF,t_70)
小结以上的流程服务端和客户端流程.
服务端->1.建立serverSocket 服务端服务.通过serverSocket构造方法绑定服务端口。
服务端->2.调用serverSocket accept 方法,当前线程被阻塞等待客户端连接接入
客户端-> 3.客户端建立socket连接,通过socket构造函数绑定指定服务端端口
客户端->4.客户端发送客户端消息字节流
服务端->5.服务端通过accept方法分配新线程处理客户端socket。
服务端->6.服务端通过handler异步处理socket字节流,并回执消息给客户端.
以上就是利用传统IO的方式来处理的标准socket。从以上的编码和总结过程可以知道。在第五步:服务端在处理每个客户端连接时都会new一个线程来处理客户端的连接。这也是传统IO在处理IO的一个特点,在面对高并发的场景下不断的创建线程难以满足。
带着这个问题我们继续后面的学习。
## 二.Netty 核心组件
### 2.1 NioEventLoop
在上述传统IO中我们通过异步线程的方式来处理客户端的连接以及处理客户端写入输出流的的处理过程。
![img](https://img-blog.csdnimg.cn/img_convert/d203df409fe049f477e9a2add8eef72a.png)
![img](https://img-blog.csdnimg.cn/img_convert/393ef1124e0ecbe742174d1306895877.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**