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);可以在数据冲刷之后关闭客户端连接
- netty的基础概念二
- netty基础概念
- netty之基础概念
- Netty 学习笔记之二 Netty 核心概念
- C#基础概念的二十五问题
- (二):模块相关的基础概念
- 【Netty基础】Netty的“零拷贝”
- Android 基于Netty的消息推送方案之概念和工作原理(二)
- Android 基于Netty的消息推送方案之概念和工作原理(二)
- Android 基于Netty的消息推送方案之概念和工作原理(二)
- C# 基础概念【二】
- C++ 基础概念(二)
- c++基础概念<二>
- 密码学基础概念(二)
- Mina基础概念二
- 二、Docker基础概念
- netty in action第三章-netty的核心概念
- JAVA基础(二)·类的一些基础特性概念
- java中的反射
- 深度学习
- Hadoop之常用shell命令整理
- 正则表达式
- 【OpenVswitch源码分析之四】控制面关键接口与调用流程
- netty的基础概念二
- A Simple Math Problem矩阵快速幂)
- React native全局变量的使用(跨组件的通信)
- 观察者模式
- 为什么要写《机器学习实践应用》这本书
- 二维表和一维表在Spotfire中的可视化差异
- HDU5536-暴力|01字典树-J
- 【JavaWeb_Part07】功能堪比 502 的强大粘合剂?Spring(春天)框架表演秀
- 20170702 正阳门下