python websocket实时消息推送

十分想念顺店杂可。。。

本人写的渣,大神勿喷。

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

服务端代码

# -*- coding: utf-8 -*-
# @Time    : 2019/3/12 10:11
# @Author  : 甄超锋
# @Email   : 4535@sohu.com
# @File    : severs.py
# @Software: PyCharm
import socket
import base64
import hashlib
from threading import Thread
import struct
import copyglobal users
users = set()def get_headers(data):'''将请求头转换为字典'''header_dict = {}data = str(data, encoding="utf-8")header, body = data.split("\r\n\r\n", 1)header_list = header.split("\r\n")print("---"*22, body)for i in range(0, len(header_list)):if i == 0:if len(header_list[0].split(" ")) == 3:header_dict['method'], header_dict['url'], header_dict['protocol'] = header_list[0].split(" ")else:k, v = header_list[i].split(":", 1)header_dict[k] = v.strip()return header_dictsock = socket.socket()
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("0.0.0.0", 8080))
sock.listen(5)# 等待用户连接
def acce():conn, addr = sock.accept()print("conn from ", conn, addr)users.add(conn)# 获取握手消息,magic string ,sha1加密# 发送给客户端# 握手消息data = conn.recv(8096)headers = get_headers(data)# 对请求头中的sec-websocket-key进行加密response_tpl = "HTTP/1.1 101 Switching Protocols\r\n" \"Upgrade:websocket\r\n" \"Connection: Upgrade\r\n" \"Sec-WebSocket-Accept: %s\r\n" \"WebSocket-Location: ws://%s%s\r\n\r\n"magic_string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'value = headers['Sec-WebSocket-Key'] + magic_stringac = base64.b64encode(hashlib.sha1(value.encode('utf-8')).digest())response_str = response_tpl % (ac.decode('utf-8'), headers['Host'], headers['url'])# 响应【握手】信息conn.send(bytes(response_str, encoding='utf-8'),)def get_data(info):payload_len = info[1] & 127if payload_len == 126:extend_payload_len = info[2:4]mask = info[4:8]decoded = info[8:]elif payload_len == 127:extend_payload_len = info[2:10]mask = info[10:14]decoded = info[14:]else:extend_payload_len = Nonemask = info[2:6]decoded = info[6:]bytes_list = bytearray()    #这里我们使用字节将数据全部收集,再去字符串编码,这样不会导致中文乱码for i in range(len(decoded)):chunk = decoded[i] ^ mask[i % 4]    #解码方式bytes_list.append(chunk)body = str(bytes_list, encoding='utf-8')return bodydef send_msg(conn, msg_bytes):"""WebSocket服务端向客户端发送消息:param conn: 客户端连接到服务器端的socket对象,即: conn,address = socket.accept():param msg_bytes: 向客户端发送的字节:return:"""token = b"\x81"  # 接收的第一字节,一般都是x81不变length = len(msg_bytes)if length < 126:token += struct.pack("B", length)elif length <= 0xFFFF:token += struct.pack("!BH", 126, length)else:token += struct.pack("!BQ", 127, length)msg = token + msg_bytes# 如果出错就是客户端断开连接try:conn.send(msg)except Exception as e:print(e)# 删除断开连接的记录users.remove(conn)# 循环等待客户端建立连接
def th():while True:acce()if __name__ == '__main__':# 循环建立连接创建一个线程Thread(target=th).start()# 循环群发while True:message = input("输入发送的数据")s_2 = copy.copy(users)for u in s_2:print(u)send_msg(u, bytes(message, encoding="utf-8"))

客户端代码

# -*- coding: utf-8 -*-
# @Time    : 2019/3/12 18:46
# @Author  : 甄超锋
# @Email   : 4535@sohu.com
# @File    : client.py
# @Software: PyCharm
try:import thread
except ImportError:import _thread as thread
import time
import websocket
ws = websocket.create_connection("ws://127.0.0.1:8080/")while True:data = ws.recv()print(data)

HTML测试代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body></body>
</html>
<script>ws =new WebSocket("ws://127.0.0.1:8080/");ws.onopen = function (ev) { //若是连接成功,onopen函数会执行console.log(22222)};ws.onmessage = function (ev) {//onmessage会接收到推送过来的消息console.log(ev);}
</script>

喜欢请收藏点赞谢谢

pythonQQ交流群:785239887

python websocket实时消息推送相关推荐

  1. python websocket实现消息推送_python Django websocket 实时消息推送

    [实例简介] Django websocket 实时消息推送 服务端主动推送 调用 send(username, title, data, url) username:用户名 title:消息标题 d ...

  2. php通知websocket,php实现websocket实时消息推送

    php实现websocket实时消息推送,供大家参考,具体内容如下 SocketService.php /** * Created by xwx * Date: 2017/10/18 * Time: ...

  3. python websocket实现消息推送_Python Websocket消息推送---GoEasy

    Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送 速度快,代码简单易懂上手快 浏览器兼容性:GoEasy推送 支持websocket ...

  4. 基于websocket的网页实时消息推送与在线聊天(上篇)

    文章目录 @[toc] 基于websocket的网页实时消息推送与在线聊天(上篇) "使用dwebsocket在django中实现websocket" websocket原理图 d ...

  5. .net 实时通信_基于 RabbitMQ 的实时消息推送

    实现服务器端推送的几种方式 Web 应用都是基于 HTTP 协议的请求/响应模式,无法像 TCP 协议那样保持长连接,因此 Web 应用就很难像手机那样实现实时的消息推送.就目前来看,Web 应用的消 ...

  6. Django dWebScoket 实时消息推送

    一.WebScoket是什么 WebSocket 是 HTML5 提供的一种浏览器与服务器间进行全双工通讯的协议.依靠这种协议可以实现客户端和服务器端 ,一次握手,双向实时通信.目前主流的浏览器都支持 ...

  7. 基于 RabbitMQ 的实时消息推送

    博主新开公众号"不太灵光的程序员" , 关注公众号,每日八点有干货推送 1 实现服务器端推送的几种方式 Web 应用都是基于 HTTP 协议的请求/响应模式,无法像 TCP 协议那 ...

  8. 未读消息(小红点),前端 与 RabbitMQ 实时消息推送实践,贼简单~

    前几天粉丝群里有个小伙伴问过:web 页面的未读消息(小红点)怎么实现比较简单,刚好本周手头有类似的开发任务,索性就整理出来供小伙伴们参考,没准哪天就能用得上呢. 之前在 <springboot ...

  9. 消息推送技术干货:美团实时消息推送服务的技术演进之路

    本文由美团技术团队分享,作者"健午.佳猛.陆凯.冯江",原题"美团终端消息投递服务Pike的演进之路",有修订. 1.引言 传统意义上来说,实时消息推送通常都是 ...

最新文章

  1. iOS UIView快速添加事件
  2. cufflinks基于dataframe数据绘制柱状图(bar plot)、堆叠柱状图(stacked bar plot)
  3. 在PHP中模拟asp的response类
  4. php-5.4.6-win64,php5.4(64位)+apache2.4(64位)+mysql环境搭建
  5. JS获取URL中GET的参数
  6. 很多人调用接口会阻塞吗_锻炼的真相你知道吗?这些你可能都想了解,很多人都会问的2点...
  7. wordpress留言板comments.php添加自定义字段,php – 如何在WordPress / WooCommerce 3中的注释表单中添加自定义字段...
  8. 【全球AI人才排行榜】美国第一,中国仅排名第7
  9. 2017面试分享(js面试题记录)
  10. Fiori as a Service - FaaS - Creation of inline task option is not available
  11. 致年轻开发人员的一封信
  12. 魔性十足的数学动态图,这种东西都拿出来分享?
  13. QScrollArea不能显示滚动条
  14. python输入三个整数_python笔记3:依次输入3个数排序打
  15. 历年研究生数学建模赛题题目
  16. 使用python将文字转为语音
  17. 一文了解数据分析师视角下的数据中台
  18. 大学计算机专业论文可以抄吗,大学生毕业论文都是抄的吗?清华大学大招:论文抄袭可开除学籍...
  19. JUC笔记(三)多线程的核心
  20. Mars3D平台介绍

热门文章

  1. DllPlugin动态链接库插件
  2. 桌面计算机图标怎样优化,桌面图标怎么变小,详细教您电脑桌面图标的太大怎么调小...
  3. 如何自制虚拟直播,在里分享3种方法,总有一个你喜欢
  4. 网络带宽相关知识和计算
  5. 使用梯子导致的浏览器不能正常使用
  6. Nacos注册中心AP架构源码(Distro)下篇
  7. 谭浩强C++ 第十一章
  8. python图书搜索与书籍封面下载
  9. ubuntu16.04运行PL-SVO
  10. python3保存的npy文件,python2无法读取的可能解决方案。