首先,了解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请求的区别在于请求中的
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服务器和/或WebSocket库通信以发送/接收数据?
您的应用程序可以使用现代浏览器中内置的webSocket支持,并可以像这样启动webSocket连接:
var socket = new WebSocket("ws://www.example.com");
这将指示浏览器启动与
www.example.com
的webSocket连接,使用与当前网页连接相同的端口。由于浏览器内置了webSocket支持,客户端会自动处理上述HTTP请求和升级协议。
在服务器端,您需要确保使用具有传入webSocket支持的Web服务器,并启用和配置该支持。由于一旦建立webSocket连接就是连续连接,它根本不遵循CGI模型。必须至少有一个长时间运行的过程来处理实时webSocket连接。在服务器模型(如CGI)中,您需要某种支持此长时间运行过程的webServer附加组件,以支持webSocket连接。在像已经是长时间运行过程的node.js这样的服务器环境中,添加webSockets在架构上没有任何变化 - 而只是为了支持webSocket协议而添加的其他库。
我建议您阅读本文,因为它讨论了从CGI-style单个请求处理到webSocket的连续套接字连接的过渡可能会很有趣:
Web Evolution:从CGI到Websockets(以及它如何帮助您更好地监视云基础架构)
如果您确实想坚持使用stdin/stdout模型,那么有一些为webSockets建模的库可供使用。这里是一个这样的库。他们的标语是"就像CGI一样,二十年后,适用于WebSockets"。
我正在尝试弄清楚如何添加WebSockets支持。我更喜欢使用编译解决方案,而不是JavaScript、Python或PHP等解释性语言。
抱歉,我不熟悉那个特定的服务器环境。找出您的选择可能需要进行深入搜索。由于webSocket连接是连续的连接,因此您将需要一个持续运行的进程,可以成为webSocket连接的服务器端部分。这可以是内置于您的webServer中的内容,也可以是webServer启动并转发传入连接的附加进程。
FYI,我在家里使用树莓派搭建了一个定制应用程序,它使用WebSockets与浏览器网页进行实时通信,并且运行良好。我恰好使用node.js作为服务器环境,并使用socket.io库在WebSockets上运行,以便在WebSockets的基础上提供更高级别的接口。我的服务器代码定期检查几个硬件传感器,然后每当有新的/更改的数据要报告时,就会向任何开放的WebSockets发送消息,以便连接的浏览器可以实时更新传感器读数。
您可能需要一些长时间运行的应用程序,将传入的WebSockets连接从Web服务器传递到您的长时间运行的进程,或者您需要在不同于Web服务器的端口上进行WebSockets连接(以便可以由完全不同的服务器进程处理),在这种情况下,您将拥有一个完全独立的服务器来处理WebSockets请求和套接字(此服务器还必须支持CORS以使浏览器能够连接到它,因为它将是与Web页面不同的端口)。