电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Django 實現 Websocket 廣播、點對點發送消息的代碼

瀏覽:139日期:2024-09-29 16:26:21

1.Django實現Websocket

使用Django來實現Websocket服務的方法很多在這里我們推薦技術最新的Channels庫來實現

1.1.安裝DjangoChannels

Channels安裝如果你是Windows操作系統的話,那么必要條件就是Python3.7

pip install channels

1.2.配置DjangoChannels

1.創建項目ChannelsReady

django-admin startprobject ChannelsReady

2.在項目的settings.py同級目錄中,新建文件routing.py

# routing.pyfrom channels.routing import ProtocolTypeRouterapplication = ProtocolTypeRouter({ # 暫時為空})

3.在項目配置文件settings.py中寫入

INSTALLED_APPS = [ ’channels’]ASGI_APPLICATION = 'ChannelsReady.routing.application'

1.3.啟動帶有Channels提供的ASGI的Django項目

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.Run ’python manage.py migrate’ to apply them.February 01, 2020 - 17:27:13Django version 3.0.2, using settings ’ChannelsReady.settings’Starting ASGI/Channels version 2.4.0 development server at http://0.0.0.0:8000/Quit the server with CTRL-BREAK.

很明顯可以看到ASGI/Channels,這樣就算啟動完成了

1.4.創建Websocket服務

1.創建一個新的應用chats

python manage.py startapp chats

2.在settings.py中注冊chats

INSTALLED_APPS = [ ’chats’, ’channels’]

3.在chats應用中新建文件chatService.py

from channels.generic.websocket import WebsocketConsumer# 這里除了 WebsocketConsumer 之外還有# JsonWebsocketConsumer# AsyncWebsocketConsumer# AsyncJsonWebsocketConsumer# WebsocketConsumer 與 JsonWebsocketConsumer 就是多了一個可以自動處理JSON的方法# AsyncWebsocketConsumer 與 AsyncJsonWebsocketConsumer 也是多了一個JSON的方法# AsyncWebsocketConsumer 與 WebsocketConsumer 才是重點# 看名稱似乎理解并不難 Async 無非就是異步帶有 async / await# 是的理解并沒有錯,但對與我們來說他們唯一不一樣的地方,可能就是名字的長短了,用法是一模一樣的# 最夸張的是,基類是同一個,而且這個基類的方法也是Async異步的class ChatService(WebsocketConsumer): # 當Websocket創建連接時 def connect(self): pass # 當Websocket接收到消息時 def receive(self, text_data=None, bytes_data=None): pass # 當Websocket發生斷開連接時 def disconnect(self, code): pass

1.5.為Websocket處理對象增加路由

1.在chats應用中,新建urls.py

from django.urls import pathfrom chats.chatService import ChatServicewebsocket_url = [ path('ws/',ChatService)]

2.回到項目routing.py文件中增加ASGI非HTTP請求處理

from channels.routing import ProtocolTypeRouter,URLRouterfrom chats.urls import websocket_urlapplication = ProtocolTypeRouter({ 'websocket':URLRouter( websocket_url )})

總結:

下載 注冊到setting.py里的app 在setting.py同級的目錄下注冊channels使用的路由----->routing.py 將routing.py注冊到setting.py 把urls.py的路由注冊到routing.py里 編寫wsserver.py來處理websocket請求

<template> <div> <input type='text' v-model='message'> <p><input type='button' @click='send' value='發送'></p> <p><input type='button' @click='close_socket' value='關閉'></p> </div></template><script>export default { name:’websocket1’, data() { return { message:’’, testsocket:’’ } }, methods:{ send(){ // send 發送信息 // close 關閉連接 this.testsocket.send(this.message) this.testsocket.onmessage = (res) => { console.log('WS的返回結果',res.data); } }, close_socket(){ this.testsocket.close() } }, mounted(){ this.testsocket = new WebSocket('ws://127.0.0.1:8000/ws/') // onopen 定義打開時的函數 // onclose 定義關閉時的函數 // onmessage 定義接收數據時候的函數 // this.testsocket.onopen = function(){ // console.log('開始連接socket') // }, // this.testsocket.onclose = function(){ // console.log('socket連接已經關閉') // } }}</script>

3.廣播消息

3.1客戶端保持不變,同時打開多個客戶端

3.2服務端存儲每個鏈接的對象

socket_list = []class ChatService(WebsocketConsumer): # 當Websocket創建連接時 def connect(self): self.accept() socket_list.append(self) # 當Websocket接收到消息時 def receive(self, text_data=None, bytes_data=None): print(text_data) # 打印收到的數據 for ws in socket_list: # 遍歷所有的WebsocketConsumer對象 ws.send(text_data) # 對每一個WebsocketConsumer對象發送數據

4.點對點消息

4.1客戶端將用戶名拼接到url,并在發送的消息里指明要發送的對象

<template> <div> <input type='text' v-model='message'> <input type='text' v-model='user'> <p><input type='button' @click='send' value='發送'></p> <p><input type='button' @click='close_socket' value='關閉'></p> </div></template><script>export default { name:’websocket1’, data() { return { message:’’, testsocket:’’, user:’’ } }, methods:{ send(){ // send 發送信息 // close 關閉連接 var data1 = {'message':this.message,'to_user':this.user} this.testsocket.send(JSON.stringify(data1)) this.testsocket.onmessage = (res) => { console.log('WS的返回結果',res.data); } }, close_socket(){ this.testsocket.close() }, generate_uuid: function() { var d = new Date().getTime(); if (window.performance && typeof window.performance.now === 'function') { d += performance.now(); //use high-precision timer if available } var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace( /[xy]/g, function(c) { var r = (d + Math.random() * 16) % 16 | 0; d = Math.floor(d / 16); return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16); } ); return uuid; }, }, mounted(){ var username = this.generate_uuid(); console.log(username) this.testsocket = new WebSocket('ws://127.0.0.1:8000/ws/'+ username +'/') console.log(this.testsocket) this.testsocket.onmessage = (res) => { console.log('WS的返回結果',res.data); } // onopen 定義打開時的函數 // onclose 定義關閉時的函數 // onmessage 定義接收數據時候的函數 // this.testsocket.onopen = function(){ // console.log('開始連接socket') // }, // this.testsocket.onclose = function(){ // console.log('socket連接已經關閉') // } }}</script>

4.2服務端存儲用戶名以及websocketConsumer,然后給對應的用戶發送信息

from channels.generic.websocket import WebsocketConsumeruser_dict ={}list = []import jsonclass ChatService(WebsocketConsumer): # 當Websocket創建連接時 def connect(self): self.accept() username = self.scope.get('url_route').get('kwargs').get('username') user_dict[username] =self print(user_dict) # list.append(self) # 當Websocket接收到消息時 def receive(self, text_data=None, bytes_data=None): data = json.loads(text_data) print(data) to_user = data.get('to_user') message = data.get('message') ws = user_dict.get(to_user) print(to_user) print(message) print(ws) ws.send(text_data) # 當Websocket發生斷開連接時 def disconnect(self, code): pass

總結

到此這篇關于Django 實現 Websocket 廣播、點對點發送消息的文章就介紹到這了,更多相關Django 實現 Websocket 廣播、點對點發送消息內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Django
相關文章:
主站蜘蛛池模板: 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 锂电池生产厂家-电动自行车航模无人机锂电池定制-世豹新能源 | 标准品网_标准品信息网_【中检计量】 | 旅游规划_旅游策划_乡村旅游规划_景区规划设计_旅游规划设计公司-北京绿道联合旅游规划设计有限公司 | 拉力机-万能试验机-材料拉伸试验机-电子拉力机-拉力试验机厂家-冲击试验机-苏州皖仪实验仪器有限公司 | 旋振筛|圆形摇摆筛|直线振动筛|滚筒筛|压榨机|河南天众机械设备有限公司 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 泰兴市热钻机械有限公司-热熔钻孔机-数控热熔钻-热熔钻孔攻牙一体机 | 粉末冶金-粉末冶金齿轮-粉末冶金零件厂家-东莞市正朗精密金属零件有限公司 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 郑州律师咨询-郑州律师事务所_河南锦盾律师事务所 | 精密五金加工厂-CNC数控车床加工_冲压件|蜗杆|螺杆加工「新锦泰」 | 楼承板设备-楼承板成型机-免浇筑楼承板机器厂家-捡来 | 北京京云律师事务所| 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 | 卫生人才网-中国专业的医疗卫生医学人才网招聘网站! | 地埋式垃圾站厂家【佳星环保】小区压缩垃圾中转站转运站 | 无压烧结银_有压烧结银_导电银胶_导电油墨_导电胶-善仁(浙江)新材料 | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | 粉碎机_塑料粉碎机_塑料破碎机厂家-星标机械 | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 阴离子聚丙烯酰胺价格_PAM_高分子聚丙烯酰胺厂家-河南泰航净水材料有限公司 | 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 | 钢制拖链生产厂家-全封闭钢制拖链-能源钢铝拖链-工程塑料拖链-河北汉洋机械制造有限公司 | 一体化污水处理设备_生活污水处理设备_全自动加药装置厂家-明基环保 | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 雪花制冰机(实验室雪花制冰机)百科| 即用型透析袋,透析袋夹子,药敏纸片,L型涂布棒-上海桥星贸易有限公司 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 安规电容|薄膜电容|陶瓷电容|智旭JEC安规电容厂家 | 美侍宠物-专注宠物狗及宠物猫训练|喂养|医疗|繁育|品种|价格 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 钛合金标准件-钛合金螺丝-钛管件-钛合金棒-钛合金板-钛合金锻件-宝鸡远航钛业有限公司 | 上海律师事务所_上海刑事律师免费咨询平台-煊宏律师事务所 | 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 食品级焦亚硫酸钠_工业级焦亚硫酸钠_焦亚硫酸钠-潍坊邦华化工有限公司 | 软文发布-新闻发布推广平台-代写文章-网络广告营销-自助发稿公司媒介星 |