在上一篇文章中,我们使用Netty构建了可以处理WebSocket协议的服务器。在此服务器中,我们构建了一个用于处理HTTP或WebSocket请求的特殊处理程序。
处理程序中有两个不同的请求,有些具有代码清洁的人可能无法忍受。因此,是否可以处理普通的HTTP请求和Websocket请求以使用其他处理程序进行处理?答案是肯定的。
我们知道,Netty中的所有消息处理都是通过Handler实现的。为了方便起见,Netty提供了一个简单的消息处理类SimpleChannelinBoundHandler。您可以通过继承它来重写ChannelRead0方法:
让我们看一下SimpleChannelinBoundHandler的定义:
您可以看到SimpleChannelinBoundHandler本身具有通用i,这是我们要讨论的方向。
如果我们想使用此处理程序来处理所有消息,则i可以将值获取为对象。
如果我们只需要处理字符串消息,那么我们就可以做到这一点:
同样,如果您想同时处理HTTP和WebSocket消息,则只需将I设置为不同的类型即可。
对于WebSocketFrame,我们有:
对于FullHttPrequest,我们有:
对于WebSocketFrame消息,从上一节中我们知道,它有6种类型,即:
其中,内容是TextWebSocketFrame和BinaryWebsocketFrame。在这里,我们专门研究TextWebSocketFrame:
对于HTTP请求中的FullHTTPRequest,我们只需安装普通HTTP服务请求的处理过程即可。
不要在这里解释太多。
等等,我们忘记了什么吗?是的,那是编码和解码器。
在上一节中,我们使用WebSocketServerHandshaker编码和解码Websocket消息。但实际上,它放置在我们的自定义Hadler代码中,该代码并不优雅。
没关系,Netty为我们提供了WebSocketerverProtocolhandler类,该类负责Websocket的编码和解码问题。
除了处理普通的Websocket握手外,WebSocketServerProtocolHandler类还为我们处理了Close,Ping,Pong的常见消息类型,我们只需要专注于实际的业务逻辑消息,这非常方便。
对于剩余的文本或二进制帧数据,将由下一个管道处理程序处理。
其中,握手有两个州,分别是:
hernshake_complete和Handshake_timeout。
handshakecomplete包含三个方面:RequestUri,RequestHeaders和SelectedSubProtocol。
最后,将WebSocketServerProtocolHandler添加到管道中,最后获得:
与HTTP请求分开的服务器和Websocket请求已完成。简单和直观是程序员追求的世界!
本文的示例可以参考:Learn-netty4
最受欢迎的解释,最深的干货,最简单的教程,您不知道的许多技巧正在等待您发现!
欢迎注意我的公共帐户:“程序的事情”,了解技术并更好地了解您!