配置Django
pip install channels daphne
注册app
修改settings.py
INSTALLED_APPS = [
'daphne', #注册daphne组件,在channels4.0开始,注册组件使用daphne,一定放在开头
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
#添加该选项,表示django以asgi的模式启动
ASGI_APPLICATION = 'webSocket.asgi.application'
wsgi:django默认启动模式,wsgi只支持同步处理请求,即http请求
asgi:该模式下支持wsgi,并且新增了异步请求和webSocket
在指定目录下创建routings.py、consumers.py
consumers.py
类似于视图views.py,创建用于socket处理的类
from channels.exceptions import StopConsumer
from channels.generic.websocket import WebsocketConsumer
class ChatConsumer(WebsocketConsumer):
def websocket_connect(self, message):
'''
当有客户端向后端发送websocket连接请求时,自动触发该函数
:param message:
:return:
'''
# 服务器允许客户端创建连接
self.accept()
def websocket_receive(self, message):
'''
浏览器基于websocket向后端发送数据,自动触发接受消息,并且处理信息
:param message:
:return:
'''
# 输出消息
print(message)
#服务端向前端回消息
self.send('服务器收到了你的消息:%s' % (message['text']))
def websocket_disconnect(self, message):
'''
客户端与服务端断开连接时,自动触发该函数
:param message:
:return:
'''
print('断开连接')
raise StopConsumer()
routings.py
与urls.py功能类似,当接受到客户发来的socket请求时,使用哪个类socket类进行处理
from django.urls import re_path, path
from app.consumers import ChatConsumer
websocket_urlpatterns = [
path('room/',ChatConsumer)
#也可以使用正则路径,这种方式用在群组通信当中
re_path('ws/chat/(?P<group>\w+)/$',ChatConsumer)
]
修改asgi.py
import os
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
from . import routings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webSocket.settings')
# 支持http请求和websocket请求
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": URLRouter(routing.websocket_urlpatterns)
})
使用浏览器的console进行简单测试
#创建websocket
var socket = new WebSocket('ws://127.0.0.1:8000/room/')
#定义收到服务器消息之后如何处理
socket.onmessage = function(e){console.log(e.data)}
#向服务器发送消息
socket.send('你好')