Javascript Websocket onopen未被调用

Posted

技术标签:

【中文标题】Javascript Websocket onopen未被调用【英文标题】:Javascript Websocket onopen not being called 【发布时间】:2021-08-21 07:35:00 【问题描述】:

我正在尝试使用 websocket 创建一个简单的服务器(Python)和客户端(javascript),但想知道为什么 Javascript 中的 onopen 没有被调用

服务器端(server.py)credit to

import os
from http.server import HTTPServer, CGIHTTPRequestHandler
os.chdir('.')
server_object = HTTPServer(server_address=('', 8080), RequestHandlerClass=CGIHTTPRequestHandler)
server_object.serve_forever()

客户端(index.html)credit to

<script type="text/javascript">
    var host = "ws://SERVER_IP:8080"; 
    try 
      var socket = new WebSocket(host);
       console.log('WebSocket - status ' + socket.readyState);
        socket.onopen = function (msg) 
            console.log("Open - status " + this.readyState);
        ;
        socket.onmessage = function (msg) 
            console.log("Received: " + msg.data);
        ;
        socket.onclose = function (msg) 
           console.log("Disconnected - status " + this.readyState);
        ;
     catch (ex) 
        console.log(ex);
    
</script>

当我运行代码时,服务器将打印CLIENT_IP - - [21/Aug/2021 15:22:18] "GET / HTTP/1.1" 200 - ,并且在控制台中的谷歌浏览器中的客户端将打印

WebSocket - status 0                                      @ index.html:5 - console.log('WebSocket - status ' + socket.readyState);
WebSocket connection to 'ws://SERVER_IP:8080/' failed:    @ index.html:4 - var socket = new WebSocket(host);
Disconnected - status 3                                   @ index.html:13 - console.log("Disconnected - status " + this.readyState);

我想知道我错过了什么,以便服务器有响应但没有调用 onopen?谢谢。

【问题讨论】:

【参考方案1】:

var socket ... 可能是函数 init() 的局部变量,所以退出函数时它会丢失。

【讨论】:

我已经更新了代码,但还是一样。 连接失败,所以没有onopen()。 服务器确实收到了连接CLIENT_IP - - [21/Aug/2021 15:22:18] "GET / HTTP/1.1" 200 - 服务器接收到连接,但这确实意味着握手是正确的,因此客户端失败 有什么扭转它的建议吗?【参考方案2】:

终于找到一个对websockets有很大帮助的帖子。

首先是为python2安装一个websockets模块pip install websockets或为python3安装pip3 install websockets

服务器

#!/usr/bin/env python

# WS server that sends messages at random intervals

import asyncio
import datetime
import random
import websockets

async def time(websocket, path):
    while True:
        now = datetime.datetime.utcnow().isoformat() + "Z"
        await websocket.send(now)
        await asyncio.sleep(random.random() * 3)

start_server = websockets.serve(time, "127.0.0.1", 5678)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

客户

<!DOCTYPE html>
<html>
    <head>
        <title>WebSocket demo</title>
    </head>
    <body>
        <script>
            var ws = new WebSocket("ws://127.0.0.1:5678/"),
                messages = document.createElement('ul');
            ws.onmessage = function (event) 
                var messages = document.getElementsByTagName('ul')[0],
                    message = document.createElement('li'),
                    content = document.createTextNode(event.data);
                message.appendChild(content);
                messages.appendChild(message);
            ;
            document.body.appendChild(messages);
        </script>
    </body>
</html>

如果您的服务器在云端,请在服务器代码中使用0.0.0.0 而不是127.0.0.1,并且在客户端代码中也一定要使用SERVER_IP 而不是127.0.0.1

【讨论】:

以上是关于Javascript Websocket onopen未被调用的主要内容,如果未能解决你的问题,请参考以下文章

Websocket 文件上传速度问题(Java websocket API 和 Javascript)

从 Python 中的 WebSocket 读取(来自 Javascript WebSocket 的数据)

Javascript - 在 Websocket 上使用承诺?

JavaScript 客户端无法连接到 Spring 4 WebSocket

让 Jetty Websocket 使用与 JavaScript Websocket 相同的语言

Javascript - WebSocket OnOpen 事件未触发