You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:26:15