您的当前位置:首页正文

python的websocket的使用

2020-07-08 来源:钮旅网
python的websocket的使⽤

⼀:websocket使⽤场景

https://django-websocket-redis.readthedocs.io/en/latest/running.html最典型的使⽤场景:聊天。

还有就是:当我们做异步处理的任务的时候,之前采⽤的长轮询或者计时器的⽅法,但是这种⽅法的开销和性能⽐较差。对于⽹页的性能的不是很好。

⽽html5的时候 ⽀持websocket和python 本⾝也⽀持websocket,由于websocket的特性和开销更⼩,性能更好。所以采⽤websocket⽅式。接下来的django中,会开发⼀个叫做channels。这种⽅式更为不错。

今天介绍websocket。⾄于websocket的好处,⽹上的介绍⼀⼤堆,可以⾃⼰百度看,不做累述。⼆ 使⽤:

简单介绍下代码:前端通过jquery的$() 来采集页⾯的IP信息,然后通过html5的websocket跟后端python通信,后端通过传过的IP信息,建⽴ansible任务,执⾏对应的采集脚本,隔⼏秒返回给前端,前端将结果替换到相应的页⾯,来更新前端的监控信息。1、python 安装websocket:

1 pip2.7 install dwebsocket

前端代码:

1 if (window.s) {

2 window.s.close() 3 }

4 /*创建socket连接*/

5 var socket = new WebSocket(\"ws://192.168.31.206:1601/get_monitor/\"); 6 socket.onopen = function () {

7 console.log('WebSocket open');//成功连接上Websocket 8 socket.send(msg) 9 };

10 socket.onmessage = function (e) {11 data=JSON.parse(e.data);

12 console.log('message: ' + e.data);//打印出服务端返回过来的数据13 $.each(data['success_ip'],14 function(key,val){

15 $( 'td:contains('+key+')').siblings().find('.cpu_val').text(val[0]);16 $( 'td:contains('+key+')').siblings().find('.io_val').text(val[2]+'m');17 $( 'td:contains('+key+')').siblings().find('.disk_val').text(val[1]+'%');18 }19

20 )21 };

22 // Call onopen directly if socket is already open

23 if (socket.readyState == WebSocket.OPEN) socket.onopen();24 window.s = socket;25 26 27 }

后端代码:

1 @accept_websocket

2 def get_monitor(request):#get monior infomation func. 3 import time

4 if request.is_websocket(): 5 while True:

6 if request.websocket.has_messages(): 7 msg=request.websocket.read() 8 ip,task_id=msg.split(':') 9 ip_list=[]

10 ip_list.append(ip)11 print ip_list,task_id

12 host_obj=models.Host.objects.filter(task_id=task_id).first()13 user=host_obj.sys_user14 pwd=host_obj.sys_pwd15 while True:

16 time.sleep(2)

17 task_obj=task_excu.Task_Runner(ip_list, user, pwd)18 ret=task_obj.get_monitor()

19 for i,v in ret['success_ip'].items():20 v=v.split('\\n')

21 ret['success_ip'][i]=v

22 request.websocket.send(json.dumps(ret))23 else:

24 time.sleep(1)25 continue

注释:

通过装饰器:@accept_websocket来让view函数的即可以接受http协议也可以接收wss 协议及websocket。 通过while死循环来,不断等待接收前端发送的消息和发送消息。 通过time模块来控制循环速度。

前端通过websocket 给后端发送消息和接收消息。

因篇幅问题不能全部显示,请点此查看更多更全内容