如何在 Jetty 9 中将 HTTPConnection 升级为 WebsocketConnection?
Posted
技术标签:
【中文标题】如何在 Jetty 9 中将 HTTPConnection 升级为 WebsocketConnection?【英文标题】:How to upgrade an HTTPConnection to a WebsocketConnection in Jetty 9? 【发布时间】:2014-10-04 07:11:14 【问题描述】:我一直在阅读 Jetty 9 的文档,他们似乎已经摆脱了 Jetty Socket Connector。所以现在我们有一个通用的 ServerConnector 并且我们“升级”和 HTTPConnection 到一个 WebSocket 连接。我已阅读有关 Socket 与 WebSocket (Difference between socket and websocket?) 的文档以及该答案中链接的所有内容。我的问题是:
1) 如何从 HTTPConnection 升级到 WebSocket 连接?有人可以提供一些示例代码吗?
2) 我正在构建一个桌面应用程序,该应用程序也连接到我正在编写的服务器。我需要模拟 TCP 连接,WebSocketConnection 对我有用吗?我问这个是因为我主要在浏览器的上下文中听到 WebSockets,我想确保它是我可以在我的客户端应用程序中使用的东西。
谢谢!
【问题讨论】:
【参考方案1】:WebSocket 不是裸 TCP 连接,让我们先把它排除在外。
它是一个帧协议,用于 TEXT、BINARY 和 CONTROL 帧(控制帧是用于 PING、PONG、CLOSE 之类的小帧)
最好阅读官方协议规范以更好地理解这一点:RFC-6455
客户端不需要是浏览器,客户端可以是任何能够发出网络请求的应用程序。
如果这符合您的需要,请继续阅读。
Jetty 本身使用原生 API 提供 WebSocket 服务器和 WebSocket 客户端实现,并且还支持 javax.websocket
标准(又名 JSR-356)。
对于 Jetty WebSocket Server,它在内部通过 org.eclipse.jetty.websocket.server.WebSocketFactory
upgrade()
私有方法执行升级。
如果您选择在 Jetty 上试验 WebSocket,请阅读文档并从本机 API 或 javax.websocket
API 中进行选择,任何一个都可以。
如果你想了解这些 API 的区别,其实有a different question/answer for that。
【讨论】:
谢谢乔金!随时救援。【参考方案2】:第一季度的答案)
我认为对于您的第一个问题,这会有所帮助。请参阅给定的链接以获取更多详细信息。 Jetty 提供了通过使用 WebSocketServlet 桥 servlet 将 WebSocket 端点连接到 Servlet 路径规范的能力。 在内部,Jetty 管理 HTTP 升级到 WebSocket 以及从 HTTP 连接迁移到 WebSocket 连接。
链接1:http://www.eclipse.org/jetty/documentation/current/jetty-websocket-server-api.html
第二季度的答案)
websocket 服务器和客户端的全双工通信发生在初始 TCP 握手时。 对于您的 websocket 客户端应用程序,肯定可以使用以下工作示例...它是一个纯 JAVA WEBSOCKET 客户端。我试过了,效果很好。
链接2:http://www.eclipse.org/jetty/documentation/current/jetty-websocket-client-api.html
【讨论】:
以上是关于如何在 Jetty 9 中将 HTTPConnection 升级为 WebsocketConnection?的主要内容,如果未能解决你的问题,请参考以下文章
在 tomcat 或 jetty 中部署 mule 应用程序时,如何在 configuration.xml 文件中将 http 端点更改为 servlet 端点?
如何在 spring-boot 中替换最新的 Jetty 9?
Jetty 9.0 嵌入了带有 SPDY 但没有 SSL/NPN 的配置