【发布时间】:2018-02-14 00:20:20
【问题描述】:
我在我正在处理的 python 项目中使用websockets。 websocket 正在一个线程中运行,并从父线程给定 2 queue's。我正在使用 javascript 连接到 websocket 服务器。
我能够通过self.ssi.get(True) 从父线程获取消息并将它们传递给 javascript websocket 客户端。
但我无法接收来自客户端的消息。当我使用 zaproxy 时,我可以看到消息通过。在 websocket 服务器上,我还能够看到数据包到达接口。 Python 不会引发错误,logger.setLevel(logging.DEBUG) 不会以与我能够看到正在发送的消息相同的方式显示消息到达。
我一直在尝试解决这个问题,但我没有找到问题的想法,欢迎任何帮助。
Python websocket 服务器:
import websockets
import logging
import asyncio
import ssl
class websocket:
def __init__(self,ssi,sso):
self.ssi = ssi
self.sso = sso
logger = logging.getLogger('websockets')
logger.setLevel(logging.DEBUG)
# logger.addHandler(logging.FileHandler('debug.log'))
logger.addHandler(logging.StreamHandler())
sslc = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
sslc.load_cert_chain(
'keys/wss.server.crt',
'keys/wss.server.key')
loop = asyncio.new_event_loop()
wsrv = websockets.serve(
self.handler,
host='0.0.0.0',
port=9000,
ssl=sslc,
loop=loop)
loop.run_until_complete(wsrv)
loop.run_forever()
async def handler(self, wss, path):
consumer_task = asyncio.ensure_future(self.consumerHandler(wss, path))
producer_task = asyncio.ensure_future(self.producerHandler(wss, path))
done, pending = await asyncio.wait(
[consumer_task, producer_task],
return_when=asyncio.FIRST_COMPLETED,)
for task in pending:
task.cancel()
async def producerHandler(self, wss, path):
while True:
msg = await self.producer()
await wss.send(str(msg))
async def consumerHandler(self, wss, path):
async for msg in wss:
await self.consumer(msg)
async def producer(self):
return self.ssi.get(True)
async def consumer(self, msg):
self.sso.put(msg.data)
Javascript 客户端:
var ws;
function ws_init() {
ws = new WebSocket("wss://pri.local:9000/");
ws.onopen = function(e) {
output("connected");
};
ws.onmessage = function(e) {
output("i: " + e.data);
};
ws.onclose = function() {
output("disconnect");
};
ws.onerror = function(e) {
output("onerror");
console.log(e)
};
}
function onSubmit() {
var input = document.getElementById("input");
ws.send(input.value);
output("o: " + input.value);
input.value = "";
input.focus();
}
function onCloseClick() {
ws.close();
}
function output(str) {
var log = document.getElementById("log");
var escaped = str.replace(/&/, "&").replace(/</, "<").
replace(/>/, ">").replace(/"/, """); // "
log.innerHTML = escaped + "<br>" + log.innerHTML;
}
【问题讨论】:
-
也许检查你的python版本 - 根据websockets.readthedocs.io/en/stable/intro.html#consumer
async for msg in wss:语法仅在3.6中可用 -
是的,你是正确的,我确定我使用的是正确的版本,谢谢。
python --version Python 3.6.4
标签: python websocket python-asyncio