我在根路径上有WebSocketServerProtocolHandler
处理程序,我也接受常规的HTTP请求。但是,WebSocketServerProtocolHandler
不会让我使用我的HTTP请求,因为它假定所有内容都是Web套接字并响应:
not a WebSocket handshake request: missing upgrade
在不需要升级到Web套接字时,我可以在WebSocketServerProtocolHandler
之后继续执行管道吗?换句话说,我需要HTTP和WebSockets在同一地址上运行。
是的,我可以复制/粘贴并自己做WebSocketServerProtocolHandler
,但有更好的方法吗?
答案 0 :(得分:1)
WebSocketServerProtocolHander的javadoc引用了io.netty.example.http.websocketx.html5.WebSocketServer示例。然而,这里发生的事情可能并不完全明显。
如果你看一下WebSocketServerInitializer的源代码,你可以看到它默认设置了一个相当标准的HTTP管道。这是因为,如您所知,升级请求是HTTP请求。魔术发生在WebSocketServerHandler的handleHttpRequest方法中。它落到第96行并假设它是升级请求(您可能想要实际检查)。它创建一个WebSocketServerHandshaker并启动握手。诀窍在于它会自动重新配置管道以处理Web套接字流量,因此您不必这样做。看看WebSocketServerHandshaker中的握手方法,看看发生了什么。