1 HTTP 协议弊端
- HTTP 协议为半双工协议,半双工协议是指数据可以在客户端和服务端两个方向传输,但是不能同时传输。意味着同一时刻只有一个方向上的数据传送
- HTTP 消息冗长且繁琐,HTTP 消息包含消息头、消息体、换行符等,通常情况下采用文本方式传输,相对于其他二进制协议效率低下
- 实时性不高
没有 WebSocket 之前,很多网站进行消息推送都是客户端轮询,服务端返回最新的数据给客户端。这种方式浏览器需要不停地向服务端发送请求,HTTP 的 header 数据比较冗长,有用数据占用比较少,浪费带宽资源
2 WebSocket 协议特点
- 单一的 TCP 连接,采用全双工通信模式
- 对代理、防火墙、路由器透明
- 无头部信息、Cookie和身份验证
- 无安全开销
- 通过 ping/pong 保持链路激活
- 服务器可以主动给客户端推消息而不用客户端轮询
3 WebSocket 协议开发
3.1 WebSocketHandler 编写
@Slf4j
public class WebSocketHandler extends SimpleChannelInboundHandler
3.2 启动类
NettyUtil.initServer(8080, () -> {
List handlers = new ArrayList<>();
// 将请求和应答消息编码或解码为 HTTP 消息
handlers.add(new HttpServerCodec());
// 将 HTTP 消息多个部分组合成一个完整的 HTTP 消息
handlers.add(new HttpObjectAggregator(65536));
// 支持浏览器和服务端进行 WebSocket 通信
handlers.add(new ChunkedWriteHandler());
// 进行设置心跳检测
handlers.add(new IdleStateHandler(10, 60, 20, TimeUnit.SECONDS));
handlers.add(new WebSocketHandler());
return handlers;
});