IO
- demo: https://gitee.com/kwenj/leaning
tcp && http
- bio: com.sirui.x.io.bio.IoStarter
- nio: com.sirui.x.io.nio.NioStarter
- 访问http://localhost:4010 可以看到后台日志
- ServerSocketChannelWrapper.doRead.84 msg如果符合http协议,则浏览器可以看到返回的数据
- http 请求头格式
- 第一行 POST(请求方法) /(uri) HTTP/1.1(协议)
- 第二行开始key-valu对的header
- 直到空行
- 请求体
POST / HTTP/1.1
Content-Type: text/plain
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Host: localhost:4010
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 8
asdfafds
- http 响应头格式
- 第一行HTTP/1.1 200 OK
- 第二行开始key-valu对的header
- 直到空行
- 响应体
从tcp到http
- BIO的服务端读取:SocketRunnable.34行 和 NIO的ServerSocketChannelWrapper.86行都需要协议来判断一次请求的数据的结束。
- http协议表示请求数据结束的方式
- get方式没有请求体
- header中Content-Length表示请求体的长度,用于静态长度
- 对方socket关闭连接
- header中Transfer-Encoding:chunked,用于动态长度,成为分块传输编码,它编码的请求体格式为一行长度值(16进制),一行数据块,直到最后一行长度值为0,一行红数据块,每行以"\r\n"分割。因此最后结尾是"0\r\n\r\n";
#body
3
con
a
sequence12
基于tcp的运用方式
- http短连接
- http的长轮询: 服务端收到客户端发来的请求后不直接响应,而是将请求hold住一段时间,在这段时间内如果数据有变化,服务端才会响应,如果没有变化则在到达一定的时间后才返回请求。这种方式能够大幅减少请求次数,减少服务端压力,同时能够增加响应的实时性。nacos的longPolling
- https://www.jianshu.com/p/acb9b1093a54
- 实现方案:servlet3.0的异步处理ServletRequest.startAsync
- http的长连接 websocket
- 长连接相对于短连接是一次连接,多次数据传输;多个调用方使用同一个传输通道,等待同一通道的数据响应。
- https://www.cnblogs.com/kiwifly/p/11729304.html 服务端客户端
- http://coolaf.com/tool/chattest 在线测试websocket
- 短连接使用场景:由client访问server端返回数据,无状态
- 长轮询使用场景:即时获取服务端数据的变化且有变化不频繁的特点。如nacos注册中心。
- 长连接:即时获取服务端的数据,且数据变化较频繁,如即时通讯。长轮询和长连接的场景都有服务端往客户端推送数据,差异在推送数据的多少。
基于性能压榨的IO框架 netty
- https://www.w3cschool.cn/essential_netty_in_action/essential_netty_in_action-un8q288w.html
- 待续