Netty实际使用说明

实时高并:毫秒之差、人数众多

系统设置

业务框架

方案一:

方案二:

说明:

NettyHttp协议解析

在上述方案中浏览器不能直接和Netty建立链接,必须借助HTTP请求进行协议升级才能实现客户端于服务器简历Web Sockert通讯,其过程中如

如果想实现弹幕必须实现http服务

Http协议交互过程

协议交互本质是指协议两端(客户端、服务端)如何传输数据?如何交换数据?

传输数据一般基于TCP/IP 实现,体现到开发语言上就是我们所熟悉的Socket 编程。

交换数据本质是指,两端(客户端、服务端)能各自识别对方所发送的数据。那么这就需要制定一套报文编码格式,双方以该格式编码数据发送给对方。Http 对应的Request 与Response报文

http报文解析方案:

1:请求行的边界是CRLF(回车),如果读取到CRLF(回车),则意味着请求行的信息已经读取完成

2:Header的边界CRLF,如果读取两个CRLF,则意味着header的信息读取完成

3:body的长度是有Content-Length来进行确定

netty关于http的解决方案

很多http server的实现都是基于servlet标准,但是netty对http实现并没有基于servlet。所以在使用上比Servlet复杂很多,比如在servlet中直接可以通过HtpServetRequest获取请求的方案、请求头、请求参数。对netty需要通过对象自行解析获取

HttpMethod: 主要对method封装,包含method序列化的操作

HttpVersion: 对version的封装,netty包含1.0和1.1的版本

QueryStringDecoder: 主要是对urI进行解析,解析path和url上面的参数。

HttpPostRequestDecoder: 对post 中body 内容进行解析获取 form 参数。

HttpHeaders: 包含对header的内容进行封装及操作

HttpContent: 是对body进行封装,本质上就是一个ByteBuf。如果ByteBuf的长度是固定的,则请求的body过大,可能包含多个HttpContent,其中最后一个为LastHttpContent(空的HttpContent),用来说明body的结束。

HttpRequest: 主要包含对Request Line和Header的组合

FullHttpRequest: 主要包含对HttpRequest和httpContent的组合

Netty Http的请求处理流程:

做为服务器的Netty就是在做编码和解码操作,分别兔肉该国ChannelHandler对象实现:

HttpRequsetDecoder:用于从byteBuf获取数据并解析封装HttpRequest对象

HttpResponseEncoder:用于将业务返回数据编码成 Response报文并发送到ByteBuf。

将以上两个对象添加进 Netty 的 pipeline 即可实现最简单的http 服务。

Http完整流程介绍:

Decoder 流程:

encode 流程:

WebScoket协议实现

webSocket 协议简介:

webSocket 是html5 开始提供的一种浏览器与服务器间进行全双工二进制通信协议,其基于TCP双向全双工作进行消息传递,同一时刻即可以发又可以接收消息,相比Http的半双工协议性能有很大的提升,

webSocket特点如下:

1.单一TCP长连接,采用全双工通信模式

2.对代理、防火墙透明

3.无头部信息、消息更精简

4.通过ping/pong 来保活

5.服务器可以主动推送消息给客户端,不在需要客户轮询

WebSocket 协议报文格式:

我们知道,任何应用协议都有其特有的报文格式,比如Http协议通过 空格 换行组成其报文。如http 协议不同在于WebSocket属于二进制协议,通过规范进二进位来组成其报文。

Http协议报文:

报文说明:

FIN

标识是否为此消息的最后一个数据包,占 1 bit

RSV1, RSV2, RSV3: 用于扩展协议,一般为0,各占1bit

Opcode
数据包类型(frame type),占4bits
0x0:标识一个中间数据包
0x1:标识一个text类型数据包
0x2:标识一个binary类型数据包
0x3-7:保留
0x8:标识一个断开连接类型数据包
0x9:标识一个ping类型数据包
0xA:表示一个pong类型数据包
0xB-F:保留
MASK:占1bits

用于标识PayloadData是否经过掩码处理。如果是1,Masking-key域的数据即是掩码密钥,用于解码PayloadData。客户端发出的数据帧需要进行掩码处理,所以此位是1。

Payload length

Payload data的长度,占7bits,7+16bits,7+64bits:

如果其值在0-125,则是payload的真实长度。

如果值是126,则后面2个字节形成的16bits无符号整型数的值是payload的真实长度。注意,网络字节序,需要转换。

如果值是127,则后面8个字节形成的64bits无符号整型数的值是payload的真实长度。注意,网络字节序,需要转换。

Payload data

应用层数据

WebSocket 在浏览当中的使用

Http 连接与webSocket

通过javaScript 中的API可以直接操作WebSocket 对象,其示例如下:

var ws = new WebSocket(“ws://localhost:8080); 

ws.onopen = function()// 建立成功之后触发的事件 { 
    console.log(“打开连接”); ws.send("ddd"); // 发送消息 
}; 

ws.onmessage = function(evt) { // 接收服务器消息
    console.log(evt.data); 
}; 

ws.onclose = function(evt) { 
    console.log(“WebSocketClosed!); // 关闭连接 
};
    
ws.onerror = function(evt) { 
    console.log(“WebSocketError!); // 连接异常 
}; 

#启动服务

#查看当前端口连接数
netstat -nat|grep -i "8880"|wc -l

#查看指定进程线程数
pstree -p 3000 | wc -l
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值