使⽤Python创建websocket服务和客户端请求
1 WebSocket是啥
本段来⾃ 。
WebSocket 和HTTP⼀样,也是⼀种通讯协议,允许服务端主动向客户端推送数据。
在 WebSocket API 中,浏览器和服务器只需要完成⼀次握⼿,两者之间就直接可以创建持久性的连接,并进⾏双向数据传输。
有很多⽹站为了实现推送技术,所⽤的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然⽽HTTP 请求可能包含较长的头部,其中真正有效的数据可能只是很⼩的⼀部分,显然这样会浪费很多的带宽等资源。
HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进⾏通讯。
2 WebSocket的C/S架构
在服务端启动接收WebSocket请求的服务,客户端建⽴Websocket连接并发送请求(Message),服务端接收后,就可以根据处理逻辑,按需向客户端发送消息了,例如发送主动推送。
3 Python websockets库
Python websockets是⽤于在Python中构建WebSocket服务器和客户端的库,它基于asyncio异步IO建⽴,提供基于协程的API。
请尽量使⽤Python≥3.6以上版本来运⾏websockets。
安装websockets:
pip3 install websockets
主要⽤到的API有:
websockets.send()
4 简单例⼦
server.py,⽤于构建websocket服务器,在本地8765端⼝启动,会将接收到的消息加上I got your message:返回回去。
async def echo(websocket, path):
async for message in websocket:
message ="I got your message: {}".format(message)
await websocket.send(message)
<_event_loop().run_until_complete(websockets.serve(echo,'localhost',8765))
<_event_loop().run_forever()
client.py和指定url建⽴websocket连接,并发送消息,然后等待接收消息,并将消息打印出来。
import asyncio
import websockets
async def hello(uri):
async t(uri)as websocket:
前端websocket怎么用
await websocket.send("Hello world!")
recv_text =v()
print(recv_text)
<_event_loop().run_until_complete(
hello('ws://localhost:8765'))
先执⾏server.py,再执⾏client.py,client.py的输出结果如下:
I got your message: Hello world!
5 主动发消息
建⽴连接之后,客户端可以随时接收服务器发来的消息。服务器可以依据逻辑,给客户端推送指定消息。
服务器和客户端代码会有⼀点变化,在服务器回完第⼀条消息之后,开始轮询时间,当秒数达到0的时候,会主动给客户端回⼀条消息。server.py:
import asyncio
import websockets
import time
async def echo(websocket, path):
async for message in websocket:
message ="I got your message: {}".format(message)
await websocket.send(message)
while True:
t = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
if str(t).endswith("0"):
await websocket.send(t)
break
<_event_loop().run_until_complete(
websockets.serve(echo,'localhost',8765))
<_event_loop().run_forever()
client.py:
async def hello(uri):
async t(uri)as websocket:
await websocket.send("Hello world!")
print("< Hello world!")
while True:
recv_text =v()
print("> {}".format(recv_text))
<_event_loop().run_until_complete(
hello('ws://localhost:8765'))
先执⾏server.py,再执⾏client.py,client.py的输出结果如下:
< Hello world!
> I got your message: Hello world!
> 2020-05-29 15:11:50
最后⼀条消息则是服务端主动给客户端发送的。
6 在浏览器上使⽤
如何在前端发送websocket请求呢?
看这段代码,先建⽴连接,然后向服务端发送Hello world,然后把接收到的所有消息依次展⽰出来。
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>websocket通信客户端</title>
<script src="jquery-3.5.0.min.js"></script>
<script type="text/javascript">
function WebSocketTest(){
if("WebSocket"in window){
// 打开⼀个 web socket
var ws =new WebSocket("ws://127.0.0.1:8765");
// 连接建⽴后的回调函数
// Web Socket 已连接上,使⽤ send() ⽅法发送数据
ws.send("Hello world!");
$("#main").append("<p>"+"<="+"Hello world!"+"</p>")
};
// 接收到服务器消息后的回调函数
var received_msg = evt.data;
if(received_msg.indexOf("sorry")==-1){
$("#main").append("<p>"+"=>"+ received_msg +"</p>")
}
};
// 连接关闭后的回调函数
// 关闭 websocket
alert("连接已关闭...");
};
}else{
// 浏览器不⽀持 WebSocket
alert("您的浏览器不⽀持 WebSocket!");
}
}
</script>
</head>
<body onload="WebSocketTest()">
<div id="main">
</div>
</body>
</html>
效果⼤概的这样的:
可以在⼀开始的时候就抓websocket的包:
这⾥可以清晰的看到每⼀条消息。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。