Netty之WebSocket协议开发
一.WebSocket定义
websocket是html5开始提供的一种浏览器与服务器间进行全双工通信的网络技术,websocket通信协议于2011年被IETF定为标准RFC6455,websocket API被W3C定位标准。
在websocket API中,浏览器与服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道,两者就可以直接互相传送数据了。websocket基于TCP双向全双工进行消息传递,在同一时刻,既可以发送消息,也可以接收消息,相比于HTTP的半双工协议,性能得到很大提升。
websocket特点:
单一的TCP连接,采用全双工模式通信;
对代理,防火墙和路由器透明;
无头部消息,cookie和身份认证;
无安全开销;
通过"ping/pong"帧保持链路激活
服务器可以主动传递消息给客户端,不再需要客户端轮询。
二.WebSocket协议开发
2.1 服务启动类WebSocketServer实现
package websocket;
import server.TimeServer;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
importio.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
importio.netty.handler.codec.http.HttpObjectAggregator;
importio.netty.handler.codec.http.HttpServerCodec;
importio.netty.handler.stream.ChunkedWriteHandler;
public class WebSocketServer {
publicvoid run(int port) throws Exception{
EventLoopGroupbossGroup=new NioEventLoopGroup();
EventLoopGroupworkerGroup=new NioEventLoopGroup();
try{
ServerBootstrapb=new ServerBootstrap();
b.group(bossGroup,workerGroup)
.channel(NioServerSocketChannel.class)
.childHanlder(newChannelInitializer<SocketChannel>() {
@Override
protectedvoid initChannel(SocketChannel ch) throws Exception{
Channelpipelinepipeline=ch.pipeline();
//添加HttpServerCode,将请求消息和应答消息编码或者解码为HTTP消息
pipeline.addLast("http-codec",newHttpServerCodec());