2015-05-20 34 views
11

我最近加入了一个新项目,我负责使用web套接字实现流数据。这个想法是目前通过HTTP请求(以RESTful方式)公开的一组信息,他们希望通过Web套接字进行公开。开始理解web套接字和http请求(和STOMP)

我在约网站插座和STOMP过去48小时内做了一大堆的研究,并希望得到几点澄清:

  1. 因此,对于客户端,并通过连接服务器web套接字而不是通过HTTP请求/响应,他们首先需要同意在它们之间建立一个Web套接字连接。这是通过HTTP GET完成的,通过一个唯一的头部来表示他们将使用Web套接字连接来代替?

  2. 理论上说,有一大堆不同的数据通过一些API暴露给浏览器。想象一下,有很多不同的HTTP请求可以做成GET,POST,DELETE。因此,为了让所有这些信息的某些部分通过Web套接字进行流式传输,只需简单地更改每个资源的当前GET请求,以检查该特殊WebSocket标头是否存在,然后执行某些操作?或者还有其他的事情需要通过网络套接字来暴露某些数据。如果您从HTTP请求初始化套接字,我可能会误解HTTP和套接字的关系。

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

+0

如果您希望实际实现WebSocket通信,那么您一定要阅读规范:https://tools.ietf.org/html/rfc6455。我相信你已经看到它,但只是想确保。 – Randy

+1

如果你只是需要使用websocket通信(不需要实现规范),那么有很多库将封装你所有的辛苦工作。 Socket.io可能是更好的Node.js库之一,因为它在浏览器不支持Web套接字的情况下使用后备。 – Randy

+0

检查这篇文章:https://blog.pusher.com/websockets-from-scratch – niba

回答

9

因此,对于客户端和服务器通过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,POST,DELETE。因此,为了让所有这些信息的某些部分通过Web套接字进行流式传输,只需简单地更改每个资源的当前GET请求,以检查该特殊WebSocket标头是否存在,然后执行某些操作?或者还有其他的事情需要通过网络套接字来暴露某些数据。如果您从HTTP请求初始化套接字,我可能会误解HTTP和套接字的关系。

这听起来像你明白这一点,但我会指出,你只能用GET来启动WebSocket。

从你描述的是什么,目前尚不清楚的是WebSockets的实际上是你想要什么。 WebSockets用于服务器和客户端之间的双向通信。如果您只是希望能够从服务器流到客户端,那么使用Server-Sent Events可以让您轻松得多。

+0

故事的要求倾向于服务器发送事件的Web套接字。所以在这个“握手”发生之后,不再需要发送http请求了?他们刚刚收到101,活饲料开始了吗? – user3037172

+0

@ user3037172是的。但是,请注意,如果连接断开,您必须手动重新连接并处理在您离开时错过的消息。 –

0

我花了超过48小时,真正让我解决这个头。这是来自AJAX的重大变化。

你可能在过低的水平的思考。如果您将消息广播到多个浏览器,则有多个消息队列系统可以通过websockets进行通信(很多或全部使用STOMP)。

但是,如果你只需要发送私人数据,你可能要停止在STOMP级别(或更低)。这个技术现在还不是很成熟,因为大多数解决方案都涉及前面提到的消息队列。 STOMP在理论上应该允许你在每一边(浏览器和服务器)有多个端点来获取消息(在JavaScript和C#之间以JSON或XML序列化)。如果你不喜欢这种技术,使用WebSockets本身来传递消息是相当容易的。在这种情况下,每边都有一个接收器,并且您传递一个简单的结构,如字符串,其中指定了消息后跟一个逗号,然后将消息本身序列化为任何适用于您的技术(我更喜欢浏览器端的JSON,但XML可以工作)。

祝你好运,并更新你的问题或评论你接受的答案与任何你不是在答案中学到的东西,以便其他人可以从中学习。

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