赞
踩
本文所用例子为个人学习的小结,如有不足之处请各位多多海涵,欢迎小伙伴一起学习进步,如果想法可在评论区指出,我会尽快回复您,不胜感激!
所公布代码或截图均为运行成功后展示。
嘿嘿,小小免责声明一下!部分代码可能与其他网络例子相似,如原作者看到有不满,请联系我修改,感谢理解与支持!
在某个车机项目的升级方案中,客户希望能实现通过网页或app点击按钮实现从服务器下发命令、文件、警告等信息到客户端,基于原系统已有的http协议,要实现服务端主动通讯客户端,考虑使用Websocket协议进行通讯,并完成服务端一对多客户端的同步通讯。
在此之前先介绍一下Websocket:
WebSocket是一种网络通信协议,它提供了全双工(full-duplex)的通信通道,允许服务器和客户端之间进行实时、双向的数据传输。
WebSocket的主要作用和优点包括但不限于:
1. 实时通信:WebSocket提供了实时的双向通信,服务器可以主动向客户端发送数据,而不需要客户端发起请求。这对于聊天应用、实时游戏、实时数据更新等场景非常有用。
2. 减少网络开销:在传统的HTTP通信中,每次请求都需要发送完整的HTTP头部信息,而且服务器不能主动向客户端发送数据,这可能导致大量的网络开销和延迟。而WebSocket在建立连接后,可以保持长连接,数据传输只需要发送极小的控制信息,大大减少了网络开销。
3. 跨域通信:WebSocket不受同源策略的限制,可以实现跨域通信。
4. 兼容性好:WebSocket协议被大多数现代浏览器所支持,具有良好的兼容性。
总的来说,WebSocket提供了一种高效、实时的网络通信方式,对于需要实时数据交互的Web应用非常有用。
开发环境:Python 3.9
开发框架:Django
IDE: Pycharm
定义了Websocket的服务端,实现监控客户端的连接,发送信息,断开等状态。
- #定义Websocket的服务类
- class WbConsumer(WebsocketConsumer):
- #客户端连接时到这
- def websocket_connect(self, message):
- print("握手成功", "scope", self)
- self.accept()
- #将连接的websocket客户端信息保存在字典中,以备后续使用
- dict.setdefault(self.channel_name, []).append(self)
-
- diclength = len(dict)
- print("websocket_connect dic length:" + str(diclength))
- if diclength>0:
- if not sendFlag.threadCreatedFlag:
- sendFlag.sentshmToClient_thread = StoppableThread()
- sendFlag.threadCreatedFlag = True
- sendFlag.sentshmToClient_thread.start()
- print("[websocket_connect ] sentshmToClient thread start")
-
- # 给客户端发送消息
- self.send("WelcomeInfo: Welcome to wserver")
- #Websocket接收到信息
- def websocket_receive(self, message):
- try:
- print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),' 客户端ip', self.scope['client'])
- if 'bytes' in message:
- text = message['bytes']
- print(len(text))
- # 给客户端发消息
- #数据头解析
- headTag = view.CharToStr( [text[0], text[1], text[2], text[3]])
-
- if headTag == "XXXX":
- #if True:
- #消息类型解析
- messagetype = view.byteListToInteger([text[4],text[5], text[6], text[7]])
-
- bodyMessageLength = view.byteListToInteger([text[8], text[9], text[10], text[11]])
- if messagetype == 3:
- filename = r"xxx"
- #省略业务逻辑
-
- else:
- res = "error,headTag error"
-
- elif "text" in message:
- text = message['text']
- print(str(text))
- res = "WS Response:{}".format(text)
- self.send(res)
-
- except Exception as e:
- del dict[self.channel_name]
- #Websocket断开时
- def websocket_disconnect(self, message):
- print('客户端断开连接了,客户端channel_name: ', self.channel_name,' message_code:',message['code'])
- del dict[self.channel_name]
- showdictitem(dict)
- diclength = len(dict)
- print("websocket_disconnect dic length:" + str(diclength))
- if (diclength == 0):
- if sendFlag.threadCreatedFlag:
- sendFlag.threadCreatedFlag = False
- sendFlag.sentshmToClient_thread.stop()
- print("websocket_disconnect threadCreatedFlag:" + str(sendFlag.threadCreatedFlag))
-
- # 服务器同意断开
- raise StopConsumer()

客户端在网页中实现,将以下代码放在网页的script中即可。
- <script>
- url_ipport = "你的ip+端口"
- socket = new WebSocket("WS://" + url_ipport + "/ws/")
-
- // 握手成功时
- socket.onopen = function (event) {
- let tag = document.createElement("div");
- tag.innerText = "[WS automatic connection succeeded]";
- document.getElementById("message").append(tag);
- on_off(false)// 关闭按钮
- }
- // 服务端发送消息时的回调
- socket.onmessage = function (event) {
- let tag = document.createElement("div");
- tag.innerText = event.data;
- console.log(event.data);
- document.getElementById("message").append(tag);
- document.getElementById("message").scrollTop = document.getElementById("message").scrollHeight;
- }
-
- //服务端主动断开连接
- socket.onclose = function (event) {
- let tag = document.createElement("div");
- tag.innerText = "[WS disconnected]";
- document.getElementById("message").append(tag);
- }
- </script>

python中的websocket客户端和服务端的实现是不是很简单,当然重要的是业务逻辑,请自己尝试一下吧!
感谢各位大佬的莅临,学习之路漫漫,吾将上下而求索。有任何想法请在评论区留言哦!
再次感谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。