如何在 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 的配置

使用maven jetty插件在java 8上运行jetty 9时出现错误扫描文件[重复]

jetty-6.1.9 怎么配置jdk

Jetty 9.0 SPDY 嵌入式配置