进行这项实验之前,先读了xbmchina的简书文章,感谢这位大神提供的关于channelPipeline和channelHandler文章:
【Netty】ChannelPipeline和ChannelHandler(一)
【Netty】ChannelHandler的添加和删除(二)
【Netty】inBound和outBound事件的传播过程
之前想以leonzm的websocket_demo项目为基础,写netty4版本的聊天室,但是发现netty4的函数不一样,messageReceived(建立链接/接收数据包)和close(断开链接)不能覆写,研究了下handler的生命周期。知道channelRead0可以建立链接,并接收已建立链接的客户端的数据包;当隧道处于channelInactived阶段时,表明数据隧道(链接)要断开了,就要进入channelUnregistered阶段,这时就可以在上面执行链接相关数据清除工作;隧道的处理器ChannelHandler也有生命周期,handlerRemoved时也可以执行类似操作。
netty的inbound和outbound的区别:除了inbound事件为被动触发,在某些情况发生时自动触发,outbound为主动触发,在需要主动执行某些操作时触发以外,outBound单独用不能接收到websocket客户端的信息(这是向外主动发信息的handler,接收信息要inbound来),outBound这个跟适合在pipeline流水线上嵌入,做AOP(切面编程)。
开始执行channelPipeline流水线程序比较:
Lanucher.java:(开启netty服务的主函数)
1 package com.company.lanucher; 2 3 import com.company.server.ReversedWebSocketServer; 4 import com.company.server.WebSocketServer; 5 6 public class Lanucher { 7 8 public static void main(String[] args) throws Exception { 9 // 启动WebSocket,如果想开启另一个服务器,注释掉Reversed,再解除WebSocketServer的注释即可 10 //new WebSocketServer().run(WebSocketServer.WEBSOCKET_PORT); 11 new ReversedWebSocketServer().run(ReversedWebSocketServer.WEBSOCKET_PORT); 12 } 13 14 }