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