当前位置:   article > 正文

[ Python ] Websocket通讯服务端+客户端_pyqt5 websocket客户端

pyqt5 websocket客户端

  一、写在前面

       本文所用例子为个人学习的小结,如有不足之处请各位多多海涵,欢迎小伙伴一起学习进步,如果想法可在评论区指出,我会尽快回复您,不胜感激!

        所公布代码或截图均为运行成功后展示。

        嘿嘿,小小免责声明一下!部分代码可能与其他网络例子相似,如原作者看到有不满,请联系我修改,感谢理解与支持!

二、本文内容

       在某个车机项目的升级方案中,客户希望能实现通过网页或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服务端代码实现

        定义了Websocket的服务端,实现监控客户端的连接,发送信息,断开等状态。

  1. #定义Websocket的服务类
  2. class WbConsumer(WebsocketConsumer):
  3.     #客户端连接时到这
  4. def websocket_connect(self, message):
  5. print("握手成功", "scope", self)
  6. self.accept()
  7. #将连接的websocket客户端信息保存在字典中,以备后续使用
  8. dict.setdefault(self.channel_name, []).append(self)
  9. diclength = len(dict)
  10. print("websocket_connect dic length:" + str(diclength))
  11. if diclength>0:
  12. if not sendFlag.threadCreatedFlag:
  13. sendFlag.sentshmToClient_thread = StoppableThread()
  14. sendFlag.threadCreatedFlag = True
  15. sendFlag.sentshmToClient_thread.start()
  16. print("[websocket_connect ] sentshmToClient thread start")
  17. # 给客户端发送消息
  18. self.send("WelcomeInfo: Welcome to wserver")
  19. #Websocket接收到信息
  20. def websocket_receive(self, message):
  21. try:
  22. print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),' 客户端ip', self.scope['client'])
  23. if 'bytes' in message:
  24. text = message['bytes']
  25. print(len(text))
  26. # 给客户端发消息
  27. #数据头解析
  28. headTag = view.CharToStr( [text[0], text[1], text[2], text[3]])
  29. if headTag == "XXXX":
  30. #if True:
  31. #消息类型解析
  32. messagetype = view.byteListToInteger([text[4],text[5], text[6], text[7]])
  33. bodyMessageLength = view.byteListToInteger([text[8], text[9], text[10], text[11]])
  34. if messagetype == 3:
  35. filename = r"xxx"
  36. #省略业务逻辑
  37. else:
  38. res = "error,headTag error"
  39. elif "text" in message:
  40. text = message['text']
  41. print(str(text))
  42. res = "WS Response:{}".format(text)
  43. self.send(res)
  44. except Exception as e:
  45. del dict[self.channel_name]
  46. #Websocket断开时
  47. def websocket_disconnect(self, message):
  48. print('客户端断开连接了,客户端channel_name: ', self.channel_name,' message_code:',message['code'])
  49. del dict[self.channel_name]
  50. showdictitem(dict)
  51. diclength = len(dict)
  52. print("websocket_disconnect dic length:" + str(diclength))
  53. if (diclength == 0):
  54. if sendFlag.threadCreatedFlag:
  55. sendFlag.threadCreatedFlag = False
  56. sendFlag.sentshmToClient_thread.stop()
  57. print("websocket_disconnect threadCreatedFlag:" + str(sendFlag.threadCreatedFlag))
  58. # 服务器同意断开
  59. raise StopConsumer()

(二)Websocket客户端代码实现

        客户端在网页中实现,将以下代码放在网页的script中即可。

  1. <script>
  2. url_ipport = "你的ip+端口"
  3. socket = new WebSocket("WS://" + url_ipport + "/ws/")
  4. // 握手成功时
  5. socket.onopen = function (event) {
  6. let tag = document.createElement("div");
  7. tag.innerText = "[WS automatic connection succeeded]";
  8. document.getElementById("message").append(tag);
  9. on_off(false)// 关闭按钮
  10. }
  11. // 服务端发送消息时的回调
  12. socket.onmessage = function (event) {
  13. let tag = document.createElement("div");
  14. tag.innerText = event.data;
  15. console.log(event.data);
  16. document.getElementById("message").append(tag);
  17. document.getElementById("message").scrollTop = document.getElementById("message").scrollHeight;
  18. }
  19. //服务端主动断开连接
  20. socket.onclose = function (event) {
  21. let tag = document.createElement("div");
  22. tag.innerText = "[WS disconnected]";
  23. document.getElementById("message").append(tag);
  24. }
  25. </script>

五、小结

       python中的websocket客户端和服务端的实现是不是很简单,当然重要的是业务逻辑,请自己尝试一下吧!

六、感谢

        感谢各位大佬的莅临,学习之路漫漫,吾将上下而求索。有任何想法请在评论区留言哦!

        再次感谢!

        

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/85388
推荐阅读
相关标签
  

闽ICP备14008679号