一 . WebSocket简介
在HTTP1.0和HTTP1.1协议中,实现服务端主动的发送消息到网页或者APP上,是比较困难的,因为HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快, 尤其是现在IM(即时通信)几乎是很多APP都需要实现的功能,我们往往采用一种轮询的方式让终端去请求服务器获取对应的数据,相信很多做过IM通信的朋友应该深有感触,其实大多数的轮询都是无效的(即没有获得到任何的数据);另外一个方面,每一次轮询都是一个完整的Http请求,而根据Http协议,每一次请求都要在Header中携带大量的参数,这无疑对带宽也是一种极大的消耗。
HTML5的诞生为我们带来的WebSocket,这是一个振奋人心的事情,WebSocket是基于Http协议的一种长连接协议,有了这种协议,我们就可以实现服务端主动往客户端发送消息的功能。有关WebSocket协议的相关信息请读者查询相关的文档,在笔者的博文中不再作过多的赘述。因为笔者最近在学习Netty, 所以今天我们就来说说Netty对WebSocket的支持。
二 . Netty对WebSocket的整合
开发环境: [注意,netty5已经被原著删除所以我们使用4.1版本,使用的同学需要注意]
使用gradle进行版本管理
JDK1.8
IDEA 2018
1. gradle配置
plugins {
id 'java'
}
group 'com.netty'
version '1.0'
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile(
"io.netty:netty-all:4.1.5.Final"
)
}
2. 服务端代码
2.1 服务端启动类
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import java.net.InetSocketAddress;
/**
* 10.netty对webSocket的支持
*
* @author Driss
* @time 2018/9/8 下午12:19
* @email tt.ckuiry@foxmail.com
*/
public class MyServer {
public static void main(String args[]) throws Exception {
EventLoopGroup boosGrop = new NioEventLoopGroup();
EventLoopGroup workerGrop = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
//使用服务端初始化自定义类WebSocketChannelInitaializer
serverBootstrap.group(boosGrop, workerGrop).channel(NioServerSocketChannel.class).childHandler(new WebSocketChannelInitaializer());
//使用了不同的端口绑定方式
ChannelFuture channelFuture = serverBootstrap.bind(new