python websocket实时消息推送

╰半夏微凉° 2022-01-12 08:11 607阅读 0赞

python websocket实时消息推送

十分想念顺店杂可。。。

本人写的渣,大神勿喷。

转载请附带本文链接,谢谢。

服务端代码

  1. # -*- coding: utf-8 -*-
  2. # @Time : 2019/3/12 10:11
  3. # @Author : 甄超锋
  4. # @Email : 4535@sohu.com
  5. # @File : severs.py
  6. # @Software: PyCharm
  7. import socket
  8. import base64
  9. import hashlib
  10. from threading import Thread
  11. import struct
  12. import copy
  13. global users
  14. users = set()
  15. def get_headers(data):
  16. '''将请求头转换为字典'''
  17. header_dict = {}
  18. data = str(data, encoding="utf-8")
  19. header, body = data.split("\r\n\r\n", 1)
  20. header_list = header.split("\r\n")
  21. print("---"*22, body)
  22. for i in range(0, len(header_list)):
  23. if i == 0:
  24. if len(header_list[0].split(" ")) == 3:
  25. header_dict['method'], header_dict['url'], header_dict['protocol'] = header_list[0].split(" ")
  26. else:
  27. k, v = header_list[i].split(":", 1)
  28. header_dict[k] = v.strip()
  29. return header_dict
  30. sock = socket.socket()
  31. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  32. sock.bind(("0.0.0.0", 8080))
  33. sock.listen(5)
  34. # 等待用户连接
  35. def acce():
  36. conn, addr = sock.accept()
  37. print("conn from ", conn, addr)
  38. users.add(conn)
  39. # 获取握手消息,magic string ,sha1加密
  40. # 发送给客户端
  41. # 握手消息
  42. data = conn.recv(8096)
  43. headers = get_headers(data)
  44. # 对请求头中的sec-websocket-key进行加密
  45. response_tpl = "HTTP/1.1 101 Switching Protocols\r\n" \
  46. "Upgrade:websocket\r\n" \
  47. "Connection: Upgrade\r\n" \
  48. "Sec-WebSocket-Accept: %s\r\n" \
  49. "WebSocket-Location: ws://%s%s\r\n\r\n"
  50. magic_string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
  51. value = headers['Sec-WebSocket-Key'] + magic_string
  52. ac = base64.b64encode(hashlib.sha1(value.encode('utf-8')).digest())
  53. response_str = response_tpl % (ac.decode('utf-8'), headers['Host'], headers['url'])
  54. # 响应【握手】信息
  55. conn.send(bytes(response_str, encoding='utf-8'),)
  56. def get_data(info):
  57. payload_len = info[1] & 127
  58. if payload_len == 126:
  59. extend_payload_len = info[2:4]
  60. mask = info[4:8]
  61. decoded = info[8:]
  62. elif payload_len == 127:
  63. extend_payload_len = info[2:10]
  64. mask = info[10:14]
  65. decoded = info[14:]
  66. else:
  67. extend_payload_len = None
  68. mask = info[2:6]
  69. decoded = info[6:]
  70. bytes_list = bytearray() #这里我们使用字节将数据全部收集,再去字符串编码,这样不会导致中文乱码
  71. for i in range(len(decoded)):
  72. chunk = decoded[i] ^ mask[i % 4] #解码方式
  73. bytes_list.append(chunk)
  74. body = str(bytes_list, encoding='utf-8')
  75. return body
  76. def send_msg(conn, msg_bytes):
  77. """
  78. WebSocket服务端向客户端发送消息
  79. :param conn: 客户端连接到服务器端的socket对象,即: conn,address = socket.accept()
  80. :param msg_bytes: 向客户端发送的字节
  81. :return:
  82. """
  83. token = b"\x81" # 接收的第一字节,一般都是x81不变
  84. length = len(msg_bytes)
  85. if length < 126:
  86. token += struct.pack("B", length)
  87. elif length <= 0xFFFF:
  88. token += struct.pack("!BH", 126, length)
  89. else:
  90. token += struct.pack("!BQ", 127, length)
  91. msg = token + msg_bytes
  92. # 如果出错就是客户端断开连接
  93. try:
  94. conn.send(msg)
  95. except Exception as e:
  96. print(e)
  97. # 删除断开连接的记录
  98. users.remove(conn)
  99. # 循环等待客户端建立连接
  100. def th():
  101. while True:
  102. acce()
  103. if __name__ == '__main__':
  104. # 循环建立连接创建一个线程
  105. Thread(target=th).start()
  106. # 循环群发
  107. while True:
  108. message = input("输入发送的数据")
  109. s_2 = copy.copy(users)
  110. for u in s_2:
  111. print(u)
  112. send_msg(u, bytes(message, encoding="utf-8"))

客户端代码

  1. # -*- coding: utf-8 -*-
  2. # @Time : 2019/3/12 18:46
  3. # @Author : 甄超锋
  4. # @Email : 4535@sohu.com
  5. # @File : client.py
  6. # @Software: PyCharm
  7. try:
  8. import thread
  9. except ImportError:
  10. import _thread as thread
  11. import time
  12. import websocket
  13. ws = websocket.create_connection("ws://127.0.0.1:8080/")
  14. while True:
  15. data = ws.recv()
  16. print(data)

HTML测试代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. </body>
  9. </html>
  10. <script>
  11. ws =new WebSocket("ws://127.0.0.1:8080/");
  12. ws.onopen = function (ev) { //若是连接成功,onopen函数会执行
  13. console.log(22222)
  14. };
  15. ws.onmessage = function (ev) {//onmessage会接收到推送过来的消息
  16. console.log(ev);
  17. }
  18. </script>

喜欢请收藏点赞谢谢

  1. pythonQQ交流群:785239887

转载于:https://www.cnblogs.com/zhenchoafeng/p/10863733.html

发表评论

表情:
评论列表 (有 0 条评论,607人围观)

还没有评论,来说两句吧...

相关阅读

    相关 抓取WebSocket消息

    介绍 很多直播或对数据及时性要求比较高的网站,使用了WebSocket。这种数据要怎么抓呢? 我们这里以socket.io为例,我们可以查看网站网页源代码看使用的H5的