gpt4 book ai didi

websocket - WebSockets服务器架构如何工作?

转载 作者:行者123 更新时间:2023-12-03 01:37:29 24 4
gpt4 key购买 nike

我试图更好地了解WebSockets的服务器端体系结构是如何工作的,目的是在嵌入式应用程序中实现它。似乎这里有3种不同的服务器端软件组件:1)用于静态HTTP页面并处理升级请求的Web服务器,2)WebSockets库(例如libwebsockets),用于处理WebSockets通信的“细节” ,以及3)我的自定义应用程序实际上可以弄清楚如何处理传入的数据。所有这些如何融合在一起?拥有单独的Web服务器和WebSocket处理部件(又名WebSocket服务器/守护程序)是否很常见?

我的应用程序如何与Web服务器和/或WebSockets库通信以发送/接收数据?例如,对于CGI,Web服务器使用环境变量将信息发送到自定义应用程序,并使用stdout接收响应。这里的等效通信系统是什么?还是通常在WebSocket库中链接到客户应用程序?但是,如何与Web服务器通信到WebSocket库和自定义应用程序呢?还是全部3个都合并为一个组件?

这就是我问的原因。我在内存有限的Blackfin处理器上的uClinux / no MMU平台上使用boa Web服务器。蟒蛇没有本地WebSocket支持,只有CGI。我试图弄清楚如何向其中添加WebSockets支持。我宁愿使用编译的解决方案,而不是像JavaScript,Python或PHP这样的解释型解决方案。我当前的应用程序使用基于CGI的长时间轮询,这不能为计划的增强提供足够的性能。

最佳答案

首先,重要的是要了解如何建立webSocket连接,因为这在webSocket连接与Web服务器之间起着重要的关系。

每个webSocket连接均以HTTP请求开头。浏览器将HTTP请求发送到请求WebSocket连接的主机/端口。该请求可能看起来像这样:

GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13


该请求与对该服务器的任何其他HTTP请求的区别是请求中的 Upgrade: websocket标头。这告诉HTTP服务器该特定请求实际上是启动webSocket连接的请求。该标头还允许Web服务器告知常规HTTP请求和打开webSocket连接的请求之间的区别。这使得体系结构中非常重要的事情得以实现,并且完全是故意这样做的。这允许将完全相同的服务器和端口用于服务Web请求和webSocket连接。所需的只是Web服务器上的一个组件,该组件在所有传入的HTTP连接上查找此 Upgrade标头,如果找到,它将接管该连接并将其转换为webSocket连接。

服务器识别出此 upgrade标头后,便会以合法的HTTP响应进行响应,但会向客户端发出信号,告知已接受对WebSocket协议的升级,如下所示:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=


那时,客户端和服务器都将原始HTTP请求中的套接字保持打开状态,并且都切换到webSocket协议。



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


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


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

var socket = new WebSocket("ws://www.example.com");


这将指示浏览器使用与当前网页连接的同一端口来启动与 www.example.com的webSocket连接。由于浏览器中内置的webSocket支持,因此会自动从客户端为您处理上述HTTP请求和升级协议。

在服务器方面,您需要确保所使用的Web服务器具有传入的WebSocket支持,并且已启用并配置了该支持。由于webSocket连接一旦建立便是连续连接,因此它实际上根本不遵循CGI模型。必须至少有一个长时间运行的进程来处理实时webSocket连接。在服务器模型(如CGI)中,您将需要某种webServer附加组件,该附加组件支持长时间运行的webSocket连接过程。在已经运行很长时间的服务器环境(如node.js)中,webSockets的添加在架构上完全没有改变-而是一个额外的库来支持webSocket协议。

我建议您可能会觉得本文很有趣,因为它讨论了从CGI样式的单个请求处理到webSocket的连续套接字连接的过渡:

Web Evolution: from CGI to Websockets (and how it will help you better monitor your cloud infrastructure)

如果您真的想坚持使用stdin / stdout模型,则可以使用一些库为webSockets建模。这是 one such library。他们的口号是“二十年后,就像WebSocket的CGI一样”。


我试图弄清楚如何向其中添加WebSockets支持。一世
宁愿使用编译的解决方案而不是某些东西
解释,例如JavaScript,Python或PHP。


抱歉,但是我对特定的服务器环境不熟悉。可能需要进行一些深入的搜索才能找到您的选择。由于webSocket连接是连续连接,因此您将需要一个连续运行的进程,该进程可以是webSocket连接的服务器端部分。这可以是webServer内置的东西,也可以是webServer启动并将转发的连接转发到的其他过程。

仅供参考,我在家里有一个基于Raspberry Pi的自定义应用程序,该应用程序使用webSockets与浏览器网页进行实时通信,并且运行良好。我碰巧将node.js用于服务器环境,并在webSockets顶部运行的socket.io库为我在webSockets顶部提供了更高级别的接口。我的服务器代码会定期检查几个硬件传感器,然后每当有新/更改的数据要报告时,它就会通过任何打开的webSockets发送消息,以便连接的浏览器可以实时获取传感器读数的更新。

您可能需要一些长时间运行的应用程序,以将传入的WebSocket连接从Web服务器传递到您的长时间运行的进程,或者您需要在与Web服务器不同的端口上建立WebSocket连接(以便它们可以由一个完全不同的服务器进程),在这种情况下,您将拥有一个单独的服务器来处理您的webSocket请求和套接字(该服务器还必须支持CORS以使浏览器能够连接到它,因为它是与您的网页不同的端口)。

关于websocket - WebSockets服务器架构如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30200225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com