我可以将 websocket 连接到非 websocket 服务器吗

Posted

技术标签:

【中文标题】我可以将 websocket 连接到非 websocket 服务器吗【英文标题】:Can I connect a websocket to a non websocket server 【发布时间】:2021-06-23 12:38:31 【问题描述】:

我有 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 服务器?谢谢!

【问题讨论】:

【参考方案1】:

在交换任何数据之前,WebSocket 连接涉及initial handshake。该握手要求客户端发送请求升级到 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 套接字的扩展,但其他浏览器没有。见Connecting to TCP Socket from browser using javascript。但这些都是基于已弃用的技术,所以现在不要指望它们能够可靠地工作。

【讨论】:

以上是关于我可以将 websocket 连接到非 websocket 服务器吗的主要内容,如果未能解决你的问题,请参考以下文章

聊天应用程序:成功重新连接到 WebSocket 服务器后该怎么办?

neo4 WebSocket 连接到“ws://localhost:7687/”失败:通过代理服务器建立隧道失败

Qt 连接到 WebSockets 服务器

WebSocket 可以连接到 Socket 服务器吗?

无法连接到 symfony 中的 websocket 服务器

是否可以将JS WebSocket连接到Python服务器?