使用Django Channels开发实时聊天应用遇WebSocket 104连接重置错误求助
Django Channels实时聊天应用:Connection reset by peer错误排查
兄弟,我之前也碰到过类似的WebSocket连接问题,结合你提供的代码片段,给你梳理几个核心排查方向:
1. 先补全不完整的ws_disconnect函数
你贴的routing.py里ws_disconnect代码没写完,Django Channels要求所有路由对应的处理函数必须完整定义,不然连接建立后会因为函数执行异常直接断开。补全后的代码应该是这样:
from channels.routing import route from channels import Group def ws_connect(message): print 'ssssssssssssss' Group('users').add(message.reply_channel) message.reply_channel.send({"accept": True}) def ws_disconnect(message): # 移除当前连接从users组中 Group('users').discard(message.reply_channel) # 别忘了定义完整的路由列表 channel_routing = [ route("websocket.connect", ws_connect), route("websocket.disconnect", ws_disconnect), ]
2. 确认用对了ASGI服务器
WebSocket依赖ASGI协议支持,如果你还在使用普通的python manage.py runserver(WSGI模式),肯定会出问题——WSGI根本不支持WebSocket。你需要切换到ASGI兼容的启动方式:
# 用Daphne启动ASGI服务器 daphne your_project_name.asgi:application # 或者Django 3.0+版本用ASGI模式的runserver python manage.py runserver --asgi
3. 检查客户端连接地址是否正确
确保websocket-client连接的是正确的WS协议地址,比如服务器跑在localhost:8000,路由路径是/ws/,那连接地址应该是ws://localhost:8000/ws/,别写成HTTP的http://开头的地址。
4. 确认Channels版本匹配
如果你的Channels是2.x及以上版本,旧的route和GroupAPI已经被弃用了,兼容性问题也可能导致连接重置。这时候建议改用Consumer模式重构代码:
# consumers.py from channels.generic.websocket import WebsocketConsumer from asgiref.sync import async_to_sync class ChatConsumer(WebsocketConsumer): def connect(self): print('ssssssssssssss') # 加入users组 async_to_sync(self.channel_layer.group_add)( 'users', self.channel_name ) self.accept() def disconnect(self, close_code): # 离开users组 async_to_sync(self.channel_layer.group_discard)( 'users', self.channel_name )
然后更新ASGI路由配置(通常在asgi.py中):
# asgi.py import os from django.core.asgi import get_asgi_application from channels.routing import ProtocolTypeRouter, URLRouter from django.urls import path from .consumers import ChatConsumer os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings') application = ProtocolTypeRouter({ "http": get_asgi_application(), "websocket": URLRouter([ path("ws/", ChatConsumer.as_asgi()), ]), })
5. 查看服务器端日志
启动服务器时,仔细盯着控制台输出的日志,有没有路由匹配失败、函数报错之类的信息——这些日志能直接帮你定位到具体的问题根源。
内容的提问来源于stack exchange,提问作者Streetway Fun
相关产品推荐
相关产品推荐

