netty的基础概念二

来源:互联网 发布:tf卡测速软件 编辑:程序博客网 时间:2024/06/03 21:21

三次握手、四次挥手

tcp连接要经历三次握手,断开要经历四次挥手

传统的socket编程缺点:

1、一个客户端连接开启一个线程,占用资源比较多

2、三次握手是比较耗时的,通信效率低

NIO 在TCP 点对点的通信基础上,服务端实例化一个serversocketchannel,创建一个多路复用Selector,客户端实例化socketChannel,注册到Selector,Selector轮询所有的Channel(通道),通过Channel的状态执行以下四种(accept,connect,read,write)操作。Java NIO的基本思想就是用一个线程来处理多个Channel。它提供了一套网络API,可以用来处理连接数很多的情况,但是NIO的API是非常繁琐的,实际工作中是不会使用NIO的API,而是使用框架netty的API。

TCP拆包与粘包

TCP粘包是指一次接收的数据不能完全地体现一个完整的消息数据。TCP通讯为何存在粘包呢?

主要原因是TCP是以流的方式来处理数据,再加上网络上MTU(最大传输单元Maximum Transmission Unit)往往小于在应用处理的消息数据,所以就会引发一次接收的数据无法满足消息的完整,导致粘包的存在。粘包举例:writeAndFlush写出后会直接冲刷,导致连续的写出变成一次请求。处理粘包的唯一方法就是制定应用层的数据通讯协议,通过协议来规范现有接收的数据是否满足消息数据的需要。netty提供三种方法:

1、尾部加上特殊字符接收,如$_

参考工程SocketIO_02_ende1,数据的发送都要包装成buffer类型,不能直接发送字符串

2、消息定长,比如5位定长字符串接收,够长度就发送,如果不够可以用空格补位,否则可能造成数据丢失

3、自定义协议,为了安全或者处理个性化业务,将消息分为消息头和消息体,在消息头中包含消息总长度的字段,然后进行业务逻辑的处理

java序列化的硬伤太多,比如序列化后的码流太大,序列化性能太低,所以使用Jboss的Marshalling包,它对jdk默认的序列化框架做了优化。Server和Client里需要加上以下Marshalling编解码,可以直接解析java对象:

MarshallingCodeCFactory.buildMarshallingDecoder()MarshallingCodeCFactory.buildMarshallingEecoder()

netty最佳实践

数据通信,心跳检测

serverHandler端writeAndFlush之后调用.addListener(ChannelFutureListener.CLOSE);可以在数据冲刷之后关闭客户端连接


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 迈之灵为什么不让卖 宝塔糖为什么不让卖 为什么黄道益不能在大陆卖 40年产权公寓卖不掉 为什么处方药不随便卖 王氏保赤丸为啥不让卖 百蕊颗粒药店为什么不让卖 14楼为什么便宜也不好卖 为什么很多药店不卖百蕊颗粒 安康鱼肝为什么不让卖 eve药中国为什么不让卖 21型二踢脚为什么不能卖 凯美瑞混动为什么卖不动 顶层房子为什么不好卖 南宁2019很多房子卖不出去 十月馨药店为什么不明卖 三不问 养龟为什么不能养双 家里为什么不能养双猫 眼科医生不建议割双眼皮 新手为什么不要开双离合 千万不要买雷凌双擎 世上安得双法不负如来不负卿 肿泡眼大夫不建议割双眼皮 双胎为什么医生不建议做四维 双闪灯一直闪关不掉怎么解决 到付邮费是不是双倍 做完双眼皮不能吃什么 甲状腺双叶回声不均匀 不可抗力3完整免费观看双结局 双钱轮胎质量好不好 双相情感障碍六亲不认 为什么双氧水不利于伤口愈合 双氧水洗耳朵会不会烧坏耳膜 双桶洗衣机脱水桶不转 非你不爱双高干 埋线双眼皮好不好 真三吧 全世界都知道我不好惹孤木双 为什么选房选单不选双 棠不吝作品