从前面几篇博客下来我们已经写了很三个项目了,你会发现netty编程也挺简单的,就是三步,第一步创建服务器Server(main函数),第二步就是管道初始化器ChnnelServerInitializer,使用netty本身的处理器或者自定义处理器,,第三步就是自定义处理器。
基本上netty开发就是围绕着这三个步骤,但是如果你学技术永远停留在这个使用的基础上,那你怕是永远得不到提升。我后面的章节将会机会往下剖析。
现在问题来了,我们之前的程序都是基于socket编程的,只是运行在应用程序之中,但是如果我们要实现在浏览器聊天那种的话,socket编程怕是不能实现,因为浏览器支持的协议是http,而http是一种无响应的请求模式,第一次请求完成之后,就抛弃掉了。如果下次在进行请求的话,服务器只会认为是另外一个请求。在很久以前采用的是轮询的方式,浏览器每隔一段时间就向服务器询问是否有信息发送给它,这种方式效率极低,所以这种情况下要实现在浏览器上面聊天的话就需要引用WebSocket了。
WebSocket:当客户端第一次向服务端请求连接之后(请求包含头部等连接信息),就进入到了长连接,在这个期间发送的数据只是包含数据没有了多余的连接信息,客户端与服务端的通信进入到一种对等的状态。
说明一下WebSocket请求还是Http请求,只是在请求的时候放入了一些WebSocket相关信息。
服务端:
创建MyServer
里面bind中使用InetSocketAddress和直接加端口号其实是一样的(这种方式比较装逼而已o(* ̄︶ ̄*)o)
创建WebSocketChannelInitializer
加入处理器
HttpServerCodec():http解码器
ChunkedWriteHandler(),后续在进行讲解
处理器 HttpObjectAggregator()
简单来说就是处理一个http的处理器,将http请求信息聚合到一起,然后进行处理。(现在没必要去深究,后面章节将会讲解)
添加websocket处理器
它会帮助你完成一些繁重的websocket请求处理,而且它还对心跳进行检查(ping,pong)
在Websocket中一共有六种frame:
BinaryWebsocketFrame:发送二进制信息
CloseWebsocketFrame:关闭
PingWebSocketFrame:心跳检测
PongWebSocketFrame:接收心跳检测
TextWebSocketFrame:发送文本信息
文字“/ws”的意义:websocket的路径(因为当浏览器发送http并且携带了websocket信息,那我们如果识别呢,那就是要求http要携带“/ws”)
常规操作,添加自定义处理器的占位符O(∩_∩)O
创建自定义处理器TextWebSocketFrameHandler:
之前的分别是httpobject、string,这一次为什么要用TextWebSocketFrame呢
因为我们这次要处理的是页面发过来的信息,普通的String处理不过来,需要使用专门的类型来接收
本身继承WebSocketFrame:
打印浏览器发来的文本信息:
将数据返回给客户端(浏览器):
说明:返回类型必须是TextWebSocketFrame,如果还用以前的方式直接传个字符串什么的话,客户端(浏览器)是接收不到的
打印客户端加入到管道中的id:
打印客户端退出来的id:
出现异常后的关闭:
将自定义处理器TextWebSocketFrameHander加入到管道初始化器中 :
将管道初始化器加入到服务器MyServer中:
浏览器客户端:
撰写html文件:
运行之后:
编写js代码:
通过js对WebSocket进行监听
通过js控制WebSocket发送信息到服务器:
启动服务器:
打开界面:
控制台输出:
当刷新界面之后:
首先移除了,在建立连接
查看网络状态:
101状态:网络转换状态
这里就显示原始请求是http请求,后来升级为websocket
向服务器发送信息:
后台打印的信息:
每一次 发送的信息都保存到了frame中:
只有websocket才有frame状态
http 请求就没frame:
建议自行添加:心跳检测!