WebSockets服务器体系结构是如何工作的?

WebSockets服务器体系结构是如何工作的?,websocket,libwebsockets,Websocket,Libwebsockets,我试图更好地理解服务器端体系结构是如何为WebSocket工作的,目的是在嵌入式应用程序中实现它。这里似乎有3个不同的服务器端软件组件:1)web服务器提供静态HTTP页面并处理升级请求,2)像libwebsockets这样的WebSockets库来处理WebSockets通信的“螺母和螺栓”,以及3)我的自定义应用程序来实际确定如何处理传入数据。所有这些是如何结合在一起的?有一个单独的web服务器和WebSocket处理部件,也就是WebSocket服务器/守护进程,这是常见的吗 我的应用程序

我试图更好地理解服务器端体系结构是如何为WebSocket工作的,目的是在嵌入式应用程序中实现它。这里似乎有3个不同的服务器端软件组件:1)web服务器提供静态HTTP页面并处理升级请求,2)像libwebsockets这样的WebSockets库来处理WebSockets通信的“螺母和螺栓”,以及3)我的自定义应用程序来实际确定如何处理传入数据。所有这些是如何结合在一起的?有一个单独的web服务器和WebSocket处理部件,也就是WebSocket服务器/守护进程,这是常见的吗

我的应用程序如何与web服务器和/或WebSockets库通信以发送/接收数据?例如,对于CGI,web服务器使用环境变量向自定义应用程序发送信息,使用标准输出接收响应。这里的等效通信系统是什么?或者您通常将WebSocket库中的链接链接到客户应用程序中?但是,与web服务器到WebSocket库+自定义应用程序的通信将如何工作?还是全部3个组合成一个组件


这就是我为什么这么问。我在内存有限的Blackfin处理器上使用uClinux/no MMU平台上的boa web服务器。boa中没有原生WebSocket支持,只有CGI。我正试图找出如何添加WebSockets支持。我更喜欢使用编译的解决方案,而不是像JavaScript、Python或PHP这样的解释性解决方案。我当前的应用程序使用CGI上的长轮询,这无法为计划的增强提供足够的性能。

首先,了解webSocket连接是如何建立的很重要,因为这在webSocket连接和web服务器之间起着重要的作用

每个webSocket连接都以HTTP请求开始。浏览器向请求webSocket连接的主机/端口发送HTTP请求。该请求可能如下所示:

GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
var socket = new WebSocket("ws://www.example.com");
此请求与对该服务器的任何其他HTTP请求的区别在于请求中的
升级:websocket
头。这会告诉HTTP服务器,此特定请求实际上是启动webSocket连接的请求。此标头还允许web服务器区分常规HTTP请求和打开webSocket连接的请求。这允许在体系结构中有一些非常重要的东西,并且完全是故意这样做的。这允许将完全相同的服务器和端口用于服务web请求和webSocket连接。所需的只是web服务器上的一个组件,该组件在所有传入的HTTP连接上查找此
升级
头,如果找到,它将接管连接并将其转换为webSocket连接

一旦服务器识别出这个
升级
头,它将以合法的HTTP响应进行响应,但该响应会向客户端发出信号,表示已接受对webSocket协议的升级,如下所示:

GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
var socket = new WebSocket("ws://www.example.com");
此时,客户机和服务器都将原始HTTP请求中的套接字保持打开状态,并切换到webSocket协议


现在,针对您的具体问题:

我的应用程序如何与web服务器和/或服务器通信 WebSockets库发送/接收数据

您的应用程序可以在现代浏览器中使用内置的webSocket支持,并可以启动webSocket连接,如下所示:

GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
var socket = new WebSocket("ws://www.example.com");
这将指示浏览器启动到
www.example.com
的webSocket连接,使用与当前网页连接的相同端口。由于浏览器中内置的webSocket支持,上述HTTP请求和升级协议将从客户端自动处理

在服务器端,您需要确保您使用的web服务器具有传入webSocket支持,并且支持已启用和配置。因为webSocket连接一旦建立就是一个连续的连接,所以它根本不遵循CGI模型。必须至少有一个长时间运行的进程处理活动webSocket连接。在服务器模型(如CGI)中,您需要某种类型的webServer附加组件来支持webSocket连接的长期运行过程。在node.js这样的服务器环境中,它已经是一个长时间运行的进程,添加webSocket在架构上根本没有改变,只是一个支持webSocket协议的附加库

我建议您可能会发现这篇文章很有趣,因为它讨论了从CGI风格的单请求处理到webSocket的连续套接字连接的转换:

如果您真的想坚持使用stdin/stdout模型,那么有一些库可以为您的for webSockets建模。给你。他们的口号是“二十年后,对于WebSocket来说,这就像CGI”

我正试图找出如何添加WebSockets支持。我 宁愿使用编译的解决方案,而不是 解释,如JavaScript、Python或PHP

对不起,我不熟悉那个特定的服务器环境。可能需要一些深入的搜索才能找到你的选择。由于webSocket连接是连续连接,因此您需要一个连续运行的进程,该进程可以是webSocket连接的服务器端部分。这可以是内置在Web服务器中的内容,也可以是Web服务器启动并将传入连接转发到的附加进程

仅供参考,我在家里有一个基于Raspberry Pi的定制应用程序,它使用webSockets与浏览器网页进行实时通信,工作正常。我碰巧在服务器环境中使用了node.js