网络编程
猫老壳
这个作者很懒,什么都没留下…
展开
-
聊天系统(5)心跳检测机制
9 心跳检测机制防止客户端假死当客户端与服务器端之间有网络等相关问题时,可能导致客户端或服务器端假死。假死有两种情况:客户端以为连接正常,发送消息时超时;服务器端以为客户端连接正常,还依然保存着连接,大量假死连接会导致服务器性能下降甚至崩溃。当正常TCP四次挥手关闭连接时是不会造成假死现象的,一般是因为网络或硬件等故障造成假死。那么如何去解决这种问题呢?在Netty中,提供了服务器端的空闲检测的Handler,即服务器端一旦在指定时间没有收到客户端发送过来的消息,就判定客户端假死,关闭该连接。这样就保原创 2020-08-04 13:08:59 · 866 阅读 · 2 评论 -
Netty聊天系统(4)群聊功能实现
7 群聊功能的实现7.1 群聊的创建创建一个创建群聊请求的实体类,依然是继承Packet,因为要通过我们的协议进行编解码服务器端创建一个处理创建群聊请求的Handler,并实现其中的逻辑创建一个群聊创建响应的实体类,继承Packet客户端创建一个Handler来处理响应创建一个CreateGroupRequestPacket类,@Datapublic class CreateGroupRequestPacket extends Packet { private String原创 2020-08-01 16:38:39 · 4085 阅读 · 1 评论 -
Netty聊天系统(3)登录与私聊功能实现
5 定义一个Handler实现身份校验在客户端与服务器端之间通信时,一定要进行身份认证,即客户端必须要登录。此时可以在用户登录完成后,在channel上添加一个标志位,表示用户已经登录。在接受客户端发送的消息时,必须确保此时客户端已经登录。在客户端登录后,在channel上添加一个标志位。在服务器端的LoginRequestHandler中,用户登录成功后,就将channel添加一个“login”的标志位,并设置为true。ctx.channel().attr(AttributeKey.newI原创 2020-07-30 21:33:10 · 1385 阅读 · 3 评论 -
Netty聊天系统(2)粘包和半包问题的解决
4 粘包和半包问题的解决什么是TCP粘包和拆包1)TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,因为面向流的通信是无消息保护边界的。由于TCP无消息保护边界,需要在接收端处理消息边界问题,也就是我们所说的粘包、拆包问题。虽原创 2020-07-30 21:31:33 · 362 阅读 · 1 评论 -
Netty聊天系统(1)通过自定义协议实现客户端与服务器端通信
1 自定义实现客户端与服务器端通信的协议1.1 通信协议的设计自定义的通信协议需要哪些内容1)魔数:第一个字段一般是魔数,一般固定的几个字节。一个PNG图片的编码中有固定数量固定内容的字节,用于表示这是一个PNG图片;Java的Class文件打头有一串魔数用于表示这是一个class文件;同样,我们的通信协议也是这么定义,服务器端或客户端收到数据包之后,会先读取魔数看看是不是我们定义的通信协议,只有是我们的通信协议时才能按照我们定义的规则正确读取数据。2)版本号:用于一个字节表示,比如Http协议原创 2020-07-29 20:08:22 · 1248 阅读 · 4 评论 -
自定义实现客户端与服务器端通信协议
自定义实现客户端与服务器端通信协议1 通信协议的设计自定义的通信协议需要哪些内容1)魔数:第一个字段一般是魔数,一般固定的几个字节。一个PNG图片的编码中有固定数量固定内容的字节,用于表示这是一个PNG图片;Java的Class文件打头有一串魔数用于表示这是一个class文件;同样,我们的通信协议也是这么定义,服务器端或客户端收到数据包之后,会先读取魔数看看是不是我们定义的通信协议,只有是我们的通信协议时才能按照我们定义的规则正确读取数据。2)版本号:用于一个字节表示,比如Http协议有1.0/原创 2020-07-29 14:52:54 · 1409 阅读 · 0 评论 -
TCP粘包拆包及Netty的解决方案
10 TCP粘包和拆包10.1 TCP粘包拆包概述什么是TCP粘包和拆包1)TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,因为面向流的通信是无消息保护边界的由于TCP无消息保护边界,需要在接收端处理消息边界问题,也就是我们原创 2020-07-23 22:04:07 · 192 阅读 · 1 评论 -
Netty的线程模型
4 I/O线程模型4.1 IO线程模型分类目前存在的线程模型主要有:1)传统的阻塞IO服务模型2)Reactor模式Reactor模式又可以根据Reactor数量和处理线程数量不同,分为:1)单Reactor单线程2)单Reactor多线程3)主从Reactor多线程Netty主要是基于主从Reactor多线程模型做了改进,其中主从Reactor多线程模型有多个Reactor。4.2 Reactor模型概述传统阻塞IO模型缺点1)每个连接都需要独立的线程去完成处理,当并发量十分大原创 2020-07-23 21:58:25 · 225 阅读 · 0 评论 -
基于Netty实现在线实时聊天系统
基于Netty实时通信的简单案例实现1 案例说明多个客户端与服务器端建立websocket连接,服务器端将收到的客户端消息发送给所有与服务器端建立连接的客户端,相当于直播间的群聊功能。当一个客户端发送消息时,所有客户端都将收到消息。并且保证实时性。2 服务器端搭建建立maven项目,引入Netty依赖:<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</a原创 2020-07-23 10:58:18 · 2068 阅读 · 1 评论 -
Java中的NIO编程
1 BIO和NIO简介BIO、NIO、AIO简介1)Java BIO : 同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销2)Java NIO : 同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理3)Java AIO(NIO.2) : 异步非阻塞,AIO 引入异步通道的概念,采用了 Pr原创 2020-07-19 09:17:13 · 409 阅读 · 0 评论