问题 开始理解Web套接字和http请求(以及STOMP)


我最近加入了一个新项目,我的任务是使用Web套接字实现流数据。这个想法是当前通过HTTP请求(以RESTful方式)公开的一堆信息,他们希望通过Web套接字公开这些信息。

我在过去48小时内对网络套接字和STOMP进行了大量研究,并希望对以下几点进行一些澄清:

  1. 因此,对于客户端和服务器通过Web套接字而不是通过HTTP请求/响应进行连接,他们首先需要同意在它们之间建立Web套接字连接。这是通过HTTP GET完成的,传递了一个唯一的标头,表示他们要使用Web套接字连接吗?

  2. 从理论上讲,有一大堆不同的数据通过某些API暴露给浏览器。想象一下,有很多不同的HTTP请求可以做成GET'S,POST',DELETE等等。因此,要通过Web套接字传输所有这些信息的某些部分,是否只需更改每个资源的当前GET请求以检查是否存在特殊的websocket标头然后执行某些操作?或者还有什么必须通过Web套接字来暴露某些数据。如果您从HTTP请求初始化套接字,我可能会误解HTTP和套接字的关系。

我认为这些是我的两个主要问题,我相信这些问题的答案将指引我朝着正确的方向继续学习更多有关该主题的内容。我试图找到任何好的示例代码示例,但我正在努力理解这一点,以便在一周内实现。


4623
2018-05-20 02:04


起源

如果您希望实际实现WebSocket通信,那么您肯定希望阅读规范: tools.ietf.org/html/rfc6455。我相信你已经看过了,但只是想确定一下。 - Randy
如果您只需要使用websocket通信(不需要实现规范),那么有很多库将为您封装所有的辛苦工作。 Socket.io可能是更好的Node.js库之一,因为它在浏览器不支持Web套接字的情况下使用后备。 - Randy
查看这篇文章: blog.pusher.com/websockets-from-scratch - niba


答案:


因此,对于客户端和服务器通过Web套接字而不是通过HTTP请求/响应进行连接,他们首先需要同意在它们之间建立Web套接字连接。这是通过HTTP GET完成的,传递了一个唯一的标头,表示他们要使用Web套接字连接吗?

是的,或多或少。标题是:

Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: <random string, base64 encoded>
Sec-WebSocket-Version: <version>

通常 version 这几天是13,虽然我相信8还在使用中。

如果服务器同意websocket,它将返回带有以下标头的HTTP代码101:

Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: <base64 encoded hash based on Sec-WebSocket-Key>

从理论上讲,有一大堆不同的数据通过某些API暴露给浏览器。想象一下,有很多不同的HTTP请求可以做成GET'S,POST',DELETE等等。因此,要通过Web套接字传输所有这些信息的某些部分,是否只需更改每个资源的当前GET请求以检查是否存在特殊的websocket标头然后执行某些操作?或者还有什么必须通过Web套接字来暴露某些数据。如果您从HTTP请求初始化套接字,我可能会误解HTTP和套接字的关系。

听起来你理解这一点,但我会指出你只能用GET启动一个WebSocket。

根据您的描述,目前尚不清楚WebSockets实际上是您想要的。 WebSockets用于服务器和客户端之间的双向通信。如果您只是希望能够从服务器流式传输到客户端,则可以更轻松地使用服务器发送事件。


9
2018-05-23 18:38



故事的要求倾向于通过服务器发送事件的Web套接字。所以在这次“握手”发生后,不再需要发送http请求了吗?他们只收到101并开始直播? - user3037172
@ user3037172是的。但请注意,如果连接断开,则必须手动重新连接并处理在您离开时错过的消息。 - Aaron Dufour


我花了48个多小时才真正理解这一点。这是AJAX的一个重大变化。

你可能会认为水平太低了。如果要向多个浏览器广播消息,则有多个消息队列系统可以通过websockets进行通信(其中许多或全部使用STOMP)。

但是,如果您只需要发送私人数据,则可能需要停在STOMP级别(或更低级别)。此时该技术尚未成熟,因为大多数解决方案都涉及前面提到的消息队列。从理论上讲,STOMP应该允许你在每一方(浏览器和服务器)上有多个端点来获取消息(在JavaScript和C#之间以JSON或XML序列化)。如果您不喜欢这种技术,那么使用WebSockets本身来回传递消息是相当容易的。在这种情况下,你每边都有一个接收器,你传递一个简单的结构,比如一个字符串,用消息命名后面跟着一个逗号,然后消息本身就按照你所使用的技术进行序列化(我更喜欢浏览器端的JSON,但XML可以工作)。

祝你好运,并用你在答案中学到的任何内容更新你的问题或评论你接受的答案,以便其他人能够从中学习。

更新:有关.NET实现WebSockets的更多信息的人请回答一些我不知道并且没有时间进行调查的细节。我的答案不完整,我只是没有时间在赏金到期前正确回答。


0
2018-05-28 18:16