情景:
django开发,已经部署网站到阿里云服务器,使用daphne监听,用websocket通信,使用 daphne -b 0.0.0.0 -p 8000 djangoProject.asgi:application启动监听后,打开网页,网站可以正常运行,但是当刷新网页或者再次重复打开这个网页,websocket就会断开,在终端报出这样的错误:
157.0.207.36:9342 - - [01/Mar/2024:03:06:43] "WSDISCONNECT /room/hony" - -
157.0.207.36:13765 - - [01/Mar/2024:03:06:44] "WSCONNECTING /room/hony" - -
157.0.207.36:13765 - - [01/Mar/2024:03:06:49] "WSDISCONNECT /room/hony" - -
2024-03-01 03:06:53,756 WARNING Application instance <Task pending name='Task-1' coro=<ProtocolTypeRouter.__call__() running at /envs/MCSenv/lib/python3.9/site-packages/channels/routing.py:71> wait_for=<Future pending cb=[_chain_future.._call_check_cancel() at /usr/local/lib/python3.9/asyncio/futures.py:384, <TaskWakeupMethWrapper object at 0x7f7a1fab0e50>()]>> for connection <WebSocketProtocol client=['157.0.207.36', 9342] path=b'/room/hony'> took too long to shut down and was killed.
websocket的错误码是1006,reason为空
代码:
js文件:
var socket = new WebSocket("ws:39.101.76.7:8000/room/hony");
socket.onopen = function(event) {
console.log('WebSocket连接已建立');
socket.send('start_query');
// socket.send(JSON.stringify({
// 'type': 'join_group',
// 'group_name': 'your_group_name',
// }));
};
socket.onmessage = function(event) {
// const data = JSON.parse(event.data);
var parsedData = JSON.parse(event.data);
parsedData.locations.forEach(function(location) {
markLocation(location.latitude, location.longitude, location.signalStrength);
});
//
// // 标记为已接收
// socket.send('received');
};
socket.onclose = function(e) {
console.log('websocket 断开: ' + e.code + ' ' + e.reason + ' ' + e.wasClean);
console.log(e);
};
consumers.py:
class MyConsumer(WebsocketConsumer):
def connect(self):
self.accept()
self.channel_layer.group_add('your_group_name', self.channel_name)
print('WebSocket连接已建立')
def disconnect(self, close_code):
self.channel_layer.group_discard('your_group_name', self.channel_name)
print('WebSocket连接已关闭')
def receive(self, text_data):
# 接收到来自WebSocket的数据
print("接收到consumer2" + text_data)
if text_data == 'start_query':
locations = LocationData.objects.all()
data = [
{
'latitude': loc.latitude,
'longitude': loc.longitude,
'signalStrength': loc.signal_strength
}
for loc in locations
]
locations.update(is_ask=True)
self.send(text_data=json.dumps({'locations': data}))
while True:
locations = LocationData.objects.filter(is_ask=False) # 获取未被处理的位置数据
data = [
{
'latitude': loc.latitude,
'longitude': loc.longitude,
'signalStrength': loc.signal_strength
}
for loc in locations
]
locations.update(is_ask=True)
self.send(text_data=json.dumps({'locations': data}))
time.sleep(30) # 30秒后再次查询
def send_data(self, event):
print("hjcbjdbsjcbsdbch")
# 从Consumer2接收到数据并发送给Web客户端的JavaScript文件
data = event['data']
print("接收到consumer2" + data)
self.send(data)
请问这是什么原因,如何解决