Netty的深入浅出--6.WebSocket的使用

从前面几篇博客下来我们已经写了很三个项目了,你会发现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:

建议自行添加:心跳检测! 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值