下面的代码在服务器和浏览器客户端连接时运行。但是,在每次请求之后,浏览器都会显示WebSocket连接已关闭。我想保持在浏览器客户端的连接打开重新开放是由于网络问题等使它变慢。早期的Nodejs WebSocket服务器从未关闭连接。
谁能告诉我插座在哪里以及如何被关闭:
# WSS (WS over TLS) server example, with a self-signed certificate
from common import *
from datetime import datetime
import numpy as np
import os
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from pathlib import Path
import re
import time
import os.path
from dateutil.relativedelta import relativedelta
now = datetime.now()
dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
print("Started time=", dt_string)
def decode_batch_predictions(pred):
input_len = np.ones(pred.shape[0]) * pred.shape[1]
# Use greedy search. For complex tasks, you can use beam search
results = keras.backend.ctc_decode(pred, input_length=input_len, greedy=True)[0][0][
:, :8
]
# Iterate over the results and get back the text
output_text = []
for res in results:
condition = tf.less(res, 0)
res = tf.where(condition, 1, res)
res = tf.strings.reduce_join(num_to_char(res)).numpy().decode("utf-8")
output_text.append(res)
return output_text
characters = [' ', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
characters = np.asarray(characters, dtype='<U1')
num_to_char = layers.StringLookup(
vocabulary=characters, mask_token=None, invert=True
)
prediction_model = tf.keras.models.load_model('model_prediction2')
opt = keras.optimizers.Adam()
prediction_model.compile(optimizer=opt)
gg_hashmap = None
frameinfo = getframeinfo(currentframe())
async def hello(websocket, path):
global gg_hashmap
print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
json_data = await websocket.recv()
obj = json.loads(json_data)
#print(obj, flush=True)
if ("l" in obj and obj["l"]=='license'):
res = {
'status': 1,
'python': 1,
}
json_string = json.dumps(res)
await websocket.send(json.dumps(json_string))
else:
print("In else pat")
def start_server():
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain("bundle.pem", "key.pem");
ip = ''
if os.name == 'nt':
ip = '127.0.0.1'
else:
ip = "0.0.0.0"
start_server = websockets.serve(
hello, ip, 31334, ssl=ssl_context
)
asyncio.get_event_loop().run_until_compaserver.pyplete(start_server)
asyncio.get_event_loop().run_forever()
def main():
print("Entered main")
global gg_hashmap
gg_hashmap = getHash();
start_server()
print("Server started")
main()
3条答案
按热度按时间rsaldnfx1#
您编写的代码没有显式关闭WebSocket连接。在使用
websockets
library的典型Python WebSocket服务器实现中,除非服务器或客户端显式关闭,否则WebSocket连接保持打开状态,或者除非发生导致协程(在本例中为hello
函数)退出的未处理异常。在您的例子中,我将检查是否存在终止
hello
协程的异常,这将有效地关闭WebSocket连接。添加异常处理和日志记录可以帮助您确定是否是这种情况,包括,如try except bloc评论的那样。
还可以查看websockets库的常见问题解答,例如:
它包括:
websockets负责在处理程序退出时关闭连接
在
websockets
库的上下文中,“处理程序”指的是处理WebSocket连接的协程--在您的例子中,是hello
函数。如果此函数因任何原因退出,则WebSocket库将自动关闭相应的WebSocket连接。在您现有的代码中,
hello
函数没有一个循环来保持它的运行和持续侦听消息。一旦它接收到一条消息并对其进行处理,该函数就到达了它的终点,这将导致WebSocket库关闭连接。要保持连接打开,可以在
hello
函数中引入一个循环,继续监听传入的消息。举例来说:添加
while True
循环将保持处理程序运行,保持WebSocket连接打开,直到收到显式的关闭请求或发生异常。u0njafvf2#
我注意到在你的代码中,你没有导入
asyncio
模块用于行中,这可能不会被执行。请使用
import asyncio
。另一点是,您应该向WebSocket客户端添加一个ping,以保持WebSocket连接处于活动状态,因为它默认关闭连接。至少每20秒添加一次ping,如下所示:
在本例中,
send_ping
函数负责每20秒发送一次“ping”消息。定期发送是使用await asyncio.sleep(20)
实现的,它在再次发送消息之前等待20秒。确保根据需要调整WebSocket服务器中的“ping”消息和处理逻辑,以适合您的特定用例。4bbkushb3#
理想情况下,WebSocket连接应该保持打开状态,直到客户端或服务器决定显式关闭它们。但是,在您的代码中,我没有看到任何显式关闭WebSocket连接的逻辑。WebSocket连接通常会因错误或其他问题而关闭。
以下是WebSocket连接可能意外关闭的一些常见原因:
错误处理:检查是否存在任何可能导致服务器关闭WebSocket连接的错误情况。在服务器日志中查找异常或错误消息。
客户端断开连接:客户端可以关闭WebSocket连接。确保客户端代码没有显式关闭连接。
空闲超时:某些WebSocket库或服务器具有空闲超时设置,用于关闭在一定时间内处于非活动状态的连接。检查您的WebSocket服务器是否有这样的设置,如果有,请根据需要进行调整。
网络问题:你提到了对网络问题的担忧。确保没有可能导致连接关闭的网络问题。
服务器崩溃:如果您的服务器崩溃或遇到未处理的异常,可能会导致WebSocket连接关闭。确保您的服务器代码是健壮的,并优雅地处理异常。
并发问题:如果您的服务器正在同时处理多个连接,请确保不存在可能导致连接关闭的竞争条件或共享资源问题。
要进一步诊断问题,您可以向服务器代码添加更多的日志记录和错误处理。此外,您可能需要检查正在使用的WebSocket库或框架,以获取与连接管理和超时相关的任何特定配置选项。
希望这段代码能解决你的问题!
验证码: