结合 websockets 和 http

Posted

技术标签:

【中文标题】结合 websockets 和 http【英文标题】:combining websockets and http 【发布时间】:2017-11-23 17:30:41 【问题描述】:

我正在创建一个想要显示统计数据的程序。 为此,我决定使用 websockets 和 http。 Websockets,因为它不需要轮询,但允许我的服务器推送任何更改(我愿意为不同的解决方案提供建议),因此可以快速更新。对于 websockets,我使用 websocket++ 库,对于 http,我使用 libmicrohttpd。 该程序在 Unix/Linux 系统上运行。

现在使用 websocket++ 创建 websocket 很简单。我让用户决定一个端口号,就是这样。使用 libmicrohttpd 的 http 也是如此。 现在的问题是,如何从 html 指向该 websocket 服务? 我只知道一个端口号(侦听所有网络接口;它绑定到 0.0.0.0)而不是主机名。我试过http://:8001/(所以没有任何主机名或IP地址),但至少Firefox不接受。 那么我该如何解决呢? 理论上我可以让 websocket++ 进行 http 处理,但这不适用于像图像这样的二进制文件,它也不允许你处理 HEAD 请求。

【问题讨论】:

要建立从客户端到任何服务器的连接,您需要一个 IP 地址和一个端口号。而且,服务器需要监听该特定端口号上的连接。我不知道您为什么要让最终用户选择端口号。这对我来说没有多大的建筑意义。为一个端口号设计,让不同的用户使用该端口上的房间或频道,这是一种保持流量分离的合乎逻辑的方式。 【参考方案1】:

我只知道一个端口号(侦听所有网络接口;它绑定到 0.0.0.0)而不知道主机名。我试过http://:8001/(所以没有任何主机名或IP地址),但至少firefox不接受。

这不可能让网络浏览器在指定端口搜索指定网页,因为您有超过一百万个网络服务器地址(您根本不可能不知道)来搜索开放端口。 因此,唯一的解决方案是在您上面提到的 html 中提供一个脚本可用于连接到您的服务的 url。

如果要绑定到 localhost (127.0.0.1):http://localhost:8001/http://127.0.0.1:8001/

【讨论】:

嗯,它与 http 服务器在同一台服务器上。本地主机不是一个选项,因为它可以设置面向互联网。【参考方案2】:

找到解决方案:

一个 http 请求(通常 - 尝试使用 chrome 和 firefox)有一个“Host:”-header。例如:

GET / HTTP/1.1
Host: keetweej.vanheusden.com:8000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0

所以我现在要做的是从主机记录中删除主机名并将 websockets 的端口号添加到它。 这行得通!

【讨论】:

以上是关于结合 websockets 和 http的主要内容,如果未能解决你的问题,请参考以下文章

结合 JavaScript、Websockets 和 Java

哪个websocket服务器实现可以和rabbitmq结合?

Play Framework - 是不是可以在 Play 中结合使用 Promise 和 WebSocket?

websocket和springmvc结合的例子都有哪些

求个websocket和springmvc结合的例子啊,网上找的都不靠谱

套接字编程和 HTML5 WebSocket 和 REST 结合的未来 [关闭]