IT学习资源分享网 - 学习更加容易!

IT资源分享网

当前位置: 主页 > Java文档 >

Netty 入门与实战 仿写微信 IM 即时通讯系统

时间:2021-08-03 13:34来源:原创 作者:老张 点击:
传统的IO模型每个连接创建成功都需要一个线程来维护,每个线程包含一个while死循环,那么1w个连接对应1w个线程,继而1w个while死循环带来如下几个问题: 1.线程资源受限:线程是操作系统中
(1)客户端使用Netty程序实现逻辑

解析控制台指令(譬如发送消息或者建立群聊等指令)->基于控制台输入创建指令对象->协议的编码(通过自定义二进制协议将指令对象封装成二进制);
接收服务端数据拆包粘包处理(截取一段完整的二进制数据包)-> 协议的解码(将此二进制数据包解析成指令对象)->将指令对象提供给相应逻辑处理器处理.
  1. 服务端使用Netty程序实现逻辑

 

2.Netty是什么?

(1)IO模型
public class IOServer {     /**      * Server服务端首先创建ServerSocket监听8000端口,然后创建线程不断调用阻塞方法 serversocket.accept()获取新的连接,当获取到新的连接给每条连接创建新的线程负责从该连接中读取数据,然后读取数据是以字节流的方式      *      * @param args      * @throws IOException      */     public static void main(String[] args) throws IOException {         ServerSocket serverSocket = new ServerSocket(8000);         //接收新连接线程         new Thread(() -> {             try {                 //(1)阻塞方法获取新的连接                 Socket socket = serverSocket.accept();                 //(2)每一个新的连接都创建一个线程,负责读取数据                 new Thread(() -> {                     try {                         byte[] data = new byte[1024];                         InputStream inputStream = socket.getInputStream();                         while (true) {                             int len;                             //(3)按照字节流方式读取数据                             while ((len = inputStream.read(data)) != -1)                                 System.out.println(new String(data, 0, len));                         }                     } catch (IOException e) {                         e.printStackTrace();                     }                 }).start();             } catch (IOException e) {                 e.printStackTrace();             }         }).start();     } }
public class IOClient {     /**      * Client客户端连接服务端8000端口每隔2秒向服务端写带有时间戳的 "hello world"      *      * @param args      */     public static void main(String[] args) {         new Thread(() -> {             try {                 Socket socket = new Socket("127.0.0.1", 8000);                 while (true) {                     try {                         socket.getOutputStream().write((new Date() + ": hello world").getBytes());                         socket.getOutputStream().flush();                         Thread.sleep(2000);                     } catch (Exception e) {                         e.printStackTrace();                     }                 }             } catch (IOException e) {                 e.printStackTrace();             }         }).start();     } }
传统的IO模型每个连接创建成功都需要一个线程来维护,每个线程包含一个while死循环,那么1w个连接对应1w个线程,继而1w个while死循环带来如下几个问题:
1.线程资源受限:线程是操作系统中非常宝贵的资源,同一时刻有大量的线程处于阻塞状态是非常严重的资源浪费,操作系统耗不起;
2.线程切换效率低下:单机CPU核数固定,线程爆炸之后操作系统频繁进行线程切换,应用性能急剧下降;
3.数据读写是以字节流为单位效率不高:每次都是从操作系统底层一个字节一个字节地读取数据.
(2)NIO模型
1.线程资源受限:NIO编程模型新来一个连接不再创建一个新的线程,把这条连接直接绑定到某个固定的线程,然后这条连接所有的读写都由该线程来负责.把这么多while死循环变成一个死循环,这个死循环由一个线程控制,一条连接来了,不创建一个while死循环去监听是否有数据可读,直接把这条连接注册到Selector上,然后通过检查Selector批量监测出有数据可读的连接进而读取数据.


免费下载地址:
链接:https://pan.baidu.com/s/1lC28719UN2CJzJiNu5YGog 
提取码:evyt

(责任编辑:admin)

java毕业设计定制、调试、运行
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片