WebSocket 实现链接 发送消息
Websocket 原理浅析地址: https://www.cnblogs.com/yuanyongqiang/articles/10457793.html
直接上代码:
myWebSocket.py 文件中
"""
下载 gevent-websocket 0.10.1
基于Flask + geventWebSocket 建立连接,发送消息
""" from geventwebsocket.server import WSGIServer # 我要WSGI为我提供服务
from geventwebsocket.handler import WebSocketHandler # WSGI遇到WS协议的时候,处理方式
from geventwebsocket.websocket import WebSocket # 语法提示,使用方法: "# type:WebSocket"
from flask import Flask, request app = Flask(__name__) @app.route("/ws")
def my_websocket_func():
print(dir(request.environ))
# ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] # 客户端服务器之间2次链接生成了长连接(大致流程这么理解,细节不是很对,有待深究)
# 第1次
# 当 WSGIServer 遇到 ws 协议请求的时候, 就会交给 WebSocketHandler去处理(验证),
# WebSocketHandler 处理完之后,把验证信息发给客户端,断开连接.
# 第2次
# 客户端收到验证信息立,马再次发送友好链接,这时候,websocket就会保持住你的链接.那么链接 就会存放在这个位置上(wsgi.websocket).
user_socket = request.environ.get("wsgi.websocket") # type:WebSocket # 写了这个,下边再使用user_socket的时候就有提示了.
# 获取到websocket链接.
print(user_socket)
return "success 了" if __name__ == '__main__':
# WSGIServer(("地址", 端口), 应用, WSGI遇到WS协议的时候处理类型使用 WebSocketHandler) 实例化一个WSGIServer的对象
http_server = WSGIServer(("0.0.0.0", 9527), application=app, handler_class=WebSocketHandler)
# WSGIServer对象.serve_forever() 把应用永远的跑起来
http_server.serve_forever()
# 这样运行起来的话,所有的提示都不在IDE环境中显示了,都会包裹在 WebSocketHandler 中
这时候在浏览器中 访问 http://127.0.0.1:9527/ws 就可以了


那么问题来了:
浏览器默认是http请求,那我该怎么发送ws请求呢?
这样,我们写一个静态网页,通过 javascript 来实现发送 ws请求:
my_websocker.html 文件中:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="content-Type" charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body> <script type="text/javascript">
var ws = new WebSocket("ws://127.0.0.1:9527/ws")
// 定义一个变量 ws,
// new一个对象 WebSocket,用来创建连接.
// 来发送 ws 协议请求 "ws://127.0.0.1:9527/ws" </script> </body>
</html>
这时候通过网页访问:
就出来了,这就代表链接创建成功了

下面我们就开始实现服务器和客户端的消息通信:
myWebSocket.py 文件中
"""
下载 gevent-websocket 0.10.1
基于Flask + geventWebSocket 建立连接,发送消息
""" from geventwebsocket.server import WSGIServer # 我要WSGI为我提供服务
from geventwebsocket.handler import WebSocketHandler # WSGI遇到WS协议的时候,处理方式
from geventwebsocket.websocket import WebSocket # 语法提示,使用方法: "# type:WebSocket"
from flask import Flask, request app = Flask(__name__) @app.route("/ws")
def my_websocket_func():
print(dir(request.environ))
# ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] # 客户端服务器之间2次链接生成了长连接(大致流程这么理解,细节不是很对,有待深究)
# 第1次
# 当 WSGIServer 遇到 ws 协议请求的时候, 就会交给 WebSocketHandler去处理(验证),
# WebSocketHandler 处理完之后,把验证信息发给客户端,断开连接.
# 第2次
# 客户端收到验证信息立,马再次发送友好链接,这时候,websocket就会保持住你的链接.那么链接 就会存放在这个位置上(wsgi.websocket).
user_socket = request.environ.get("wsgi.websocket") # type:WebSocket # 写了这个,下边再使用 user_socket 的时候就有提示了
获取到 websocket链接
print(user_socket)
# <geventwebsocket.websocket.WebSocket object at 0x03B89688> while 1:
msg = user_socket.receive() # 等待接收客户端发送过来的消息
print(msg)
user_socket.send(msg) # 把接收到的消息再发送回去 if __name__ == '__main__':
# WSGIServer(("地址", 端口), 应用, WSGI遇到WS协议的时候处理类型使用 WebSocketHandler) 实例化一个WSGIServer的对象
http_server = WSGIServer(("0.0.0.0", 9527), application=app, handler_class=WebSocketHandler)
# WSGIServer对象.serve_forever() 把应用永远的跑起来
http_server.serve_forever()
# 这样运行起来的话,所有的提示都不在IDE环境中显示了,都会包裹在 WebSocketHandler 中
my_websocker.html 文件中:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="content-Type" charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body> <script type="text/javascript">
var ws = new WebSocket("ws://127.0.0.1:9527/ws");
// 定义一个变量 ws,
// new一个对象 WebSocket,用来创建链接.
// 来发送 ws 协议请求 "ws://127.0.0.1:9527/ws" // 因为不知道建立起链接之后,服务端什么时候会给我发消息.所以这里需要一个当有消息来了触发的一个函数:
ws.onmessage = function (websocket_data) {
console.log(websocket_data.data);
}
// 当 ws 收到消息时执行 onmessage
// 触发 收到消息 用 onmessage </script> </body>
</html>
my_websocker.html 访问:

通过 ws.send("你好") 给服务器发信息,可以看到服务器回复的信息.

readyState: 0 0代表没有创建
readyState: 1 1代表当前状态正确,可以使用了
readyState: 3 3代表曾经创建成功了,又关上了
这个版本仅仅是为了了解WebSocket 运行,未作容错,所以在页面刷新的时候后台会报错...
WebSocket 实现链接 发送消息的更多相关文章
- SSM框架下使用websocket实现后端发送消息至前端
本篇文章本人是根据实际项目需求进行书写的第一版,里面有些内容对大家或许没有用,但是核心代码本人已对其做了红色标注.文章讲解我将从maven坐标.HTML页面.js文件及后端代码一起书写. 一.mave ...
- WebSocket.之.基础入门-前端发送消息
WebSocket.之.基础入门-前端发送消息 在<WebSocket.之.基础入门-建立连接>的代码基础之上,进行添加代码.代码只改动了:TestSocket.java 和 index. ...
- java集成WebSocket向指定用户发送消息
一.WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通 ...
- springboot集成websocket实现向前端浏览器发送一个对象,发送消息操作手动触发
工作中有这样一个需示,我们把项目中用到代码缓存到前端浏览器IndexedDB里面,当系统管理员在后台对代码进行变动操作时我们要更新前端缓存中的代码怎么做开始用想用版本方式来处理,但这样的话每次使用代码 ...
- RabbitMQ 入门系列:3、基础编码:官方SDK的引用、链接创建、单例改造、发送消息、接收消息。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- WebSocket 实现链接 群聊(low low low 版本)
py 文件: """ 下载 gevent-websocket 0.10.1 基于Flask + geventWebSocket 建立连接,发送消息,实现群消息功能. &q ...
- springboot2.0+websocket集成【群发消息+单对单】(二)
https://blog.csdn.net/qq_21019419/article/details/82804921 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上 ...
- Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码
功能介绍 客户端给所有在线用户发送消息 客户端给指定在线用户发送消息 服务器给客户端发送消息(轮询方式) 项目搭建 项目结构图 pom.xml <?xml version="1.0&q ...
- 利用laravel-echo主动向服务端发送消息,实现在线状态管理
之前在网上翻了半天,也没有找到关于如何 通过laravel-echo主动发送消息 和 在laravel-websockets中自定义控制器 的文章或教程.无奈之下只能翻laravel-echo和lar ...
随机推荐
- 洛谷题解 CF807A 【Is it rated?】
同步题解 题目 好吧,来说说思路: 1.先读入啦~(≧▽≦)/~啦啦啦 2.判断a[i]赛前赛后是否同分数,如果分数不同,则输出,return 0 . 3.如果同分数,则判断a[i]赛前(或赛后)是否 ...
- Linux背背背(5)
目录: 1.rpm 2.运行模式 3.网卡 rpm软件管理 在Linux中的rpm其实有点类似于windows下的“xxx电脑管家”.“xxx软件管家”,其作用就是管理软件(查询软件的安装情况,安装软 ...
- 转发: 关于ST MCU的UID详细说明
https://www.stmcu.org.cn/article/id-327990 ST MCU芯片中的绝大部分都内置一串96位唯一标识码[unique ID].时不时有人问起这个东西,尤其最近感, ...
- cd tom-bash: cannot create temp file for here-document: No space left on device
Linux使用tab补全时提示 cd tom-bash: cannot create temp file for here-document: No space left on device 这是因为 ...
- 6.2 集合和映射--集合Set->底层基于链表实现
在6.1中我们实现了底层基于二叉搜索树的集合,本节就底层如何基于链表实现进行学习,注意:此处的链表是之前自己封装的. 1.集合set相关功能 1.1 add()的不同 用于链表本身没有去重的效果,因此 ...
- 分组密码算法AES-128,192,256 C语言实现第一版
AES的C语言实现入门版 AES分组密码算法中明文分组位128bits,密钥分组可以为128,192,256bits.AES也是由最基本的变换单位——“轮”多次迭代而成的.我们将 AES 中的轮变换计 ...
- R开发环境搭建
1.准备集成开发环境(IDE) R语言在一个好的IDE工具上应用才能更好的发挥它的作用,目前使用的最多的R语言集成开发环境是R STUDIO,下载地址为:https://www.rstudio.com ...
- python-day19 Django模板,路由分发,ORM
@获取文件所有数据 request.FILES: request.POST.get('fafafa')#拿到文件名: user = request.POST.get('user',None)#用get ...
- HTML5 使用 JS 生成二维码,带头像
一般在项目开发中,前端显示给用户扫描的二维码基本都是由后端代码生成的,那么这个高大上的功能能不能用 JS 来绘制呢? 答案是肯定的 首先我们需要一个插件 jquery.qrcode.js,该插件基于 ...
- Linux查看与挂载新磁盘
问题 把CentOS都换成了Ubuntu Server(16.04 LTS),用df -h查看磁盘占用情况,确发现之前插入的一块大容量磁盘/dev/sdb1消失了.是磁盘坏了?还是没被系统识别? 解决 ...