javascript - 我可以将 websocket 连接到非 websocket 服务器吗
问题描述
我有 rust TCP 服务器代码:
fn main() {
let mut server: TcpListener = TcpListener::bind("0.0.0.0:8080")
.expect("[SERVER]: Failed to bind");
let mut handler: Handler = Handler::new();
loop {
let mut Client = server.accept().unwrap();
//Handler basically tests if client has send a message and prints that message out
//the problem is, the client "Connects" server-side, but the websocket client say's it is "connecting"
handler.newClient(Client.0);
}
}
我有连接到服务器的 websocket 客户端代码(来自浏览器):
let ws = new WebSocket("ws://0.0.0.0:8080");
ws.onopen = function(event) {
ws.send("Hello, world!");
}
任何时候客户端连接服务器都会为其创建一个新线程并记录“客户端连接”并记录客户端发送的任何内容。当我执行客户端脚本时,服务器按预期打印出“客户端已连接”。但它永远不会收到客户端应该发送的“Hello, world!”。我怀疑它是因为你必须制作一个实际的 websocket 服务器。有没有办法将 websocket 连接到非 websocket/socket.io 服务器?或者至少使用不同的方式在浏览器中使用 js 连接到非 socket.io/websocket 服务器?谢谢!
解决方案
WebSocket 连接涉及在交换任何数据之前的初始握手。该握手要求客户端发送请求升级到 WebSocket 的 HTTP 请求,并且服务器发送回指示升级是否成功的 HTTP 响应。只有成功后,WebSocket 消息才能来回交换。
您的示例服务器未实现 WebSocket 协议,因此 WebSocket 客户端将无法完成初始握手,这就是您看不到任何数据从ws.send()
. onopen
如果握手失败,客户端将不会触发事件。相反,它将触发onerror
您的示例未处理的事件。
所以,回答你的问题:
WebSocket 客户端无法连接到非 WebSocket 服务器。
没有标准的 API 允许浏览器连接到非 HTTP 或非 WebSocket 服务器1。通常,在过去,在 WebSockets 发明之前,这将在浏览器上下文之外使用 Java 小程序或 ActiveX 控件进行处理,但这种技术已不再用于现代 Web 系统。
1:实际上,Chrome 和 FireFox 有允许使用原始 TCP/UDP 套接字的扩展,但其他浏览器没有。请参阅使用 javascript 从浏览器连接到 TCP 套接字。但是这些都是基于已弃用的技术,所以现在不要指望它们能够可靠地/根本不工作。
推荐阅读
- sql - 使用postgresql中的顺序日期将数据宽转换为长
- android - 如何为 ImageView 设置动画,以便一旦它到达屏幕的上端,它就会从屏幕的底端开始显示?
- jquery - 在 jquery 字符串中,我想传递字段值而不是常量作为参数
- pandas - 基于第三列的差异熊猫数据框列的条件
- javascript - 异步等待阻止其他功能运行
- powerbi - 如何以 Excel 格式下载整个 PowerBi 报告
- arrays - 无法过滤另一个数组中的空数组(打字稿)
- java - Jackson 序列化和反序列化 Map
- mysql - sql查询,返回所有比他们认识的人大5岁以上的人
- python - 如何使用python获得回归线上一点的置信区间?