python web页面输出_python+socket+jq实现web页面实时输出结果
例如有这样一个需求:
在终端上进行ping操作,现在想把这个这个操作放到web页面上进行,并且实现实时输出的效果。
来分析下具体实现过程
第一步,传统的http请求实现这个有点不太友好,因为这里边是一个请求,请求中间隔输出结果。 可以使用长轮询,这个以后再研究。
这种情况用websocket比较好。
然后再来解决几个疑惑,
怎么去写服务端的websocket?
方法: 这个选择比较多,python的很多框架里边都带有websocket模块,例如gevent-websocket,dwebsocket,flask_sockets
但是使用api却有不同,其实这些都是对socket进行来新的封装,所以这里用最原始的socket进行编程。
怎么发送websocket请求?
方法:发送websocket请求这个方法也比较多,有专门的第三方模块,例如websocket_client,jquery。这次是打算在web页面上显示,所以用jquery自带的api来请求服务端。
WebSocket 和 Socket 的区别,websocket 能连 socket 吗?
方法:就像Java和JavaScript,并没有什么太大的关系,但又不能说完全没关系。可以这么说,socket并不是一个协议,而是抽象出来的一层,应用于应用层和传输控制层之间的一组接口,socket是传输控制层协议,websocket是应用层协议。 jquery自带的api能有直接请求socket。
下边就直接上代码了
服务端:
#!/usr/bin/env python#-*- coding:utf-8 -*-
importsocketimportbase64importhashlibdefget_headers(data):"""将请求头格式化成字典
:param data:
:return:"""header_dict={}
data= str(data, encoding='utf-8')
header, body= data.split('\r\n\r\n', 1)
header_list= header.split('\r\n')for i inrange(0, len(header_list)):if i ==0:if len(header_list[i].split(' ')) == 3:
header_dict['method'], header_dict['url'], header_dict['protocol'] = header_list[i].split(' ')else:
k, v= header_list[i].split(':', 1)
header_dict[k]=v.strip()returnheader_dictdefsend_msg(conn, msg_bytes):"""WebSocket服务端向客户端发送消息
:param conn: 客户端连接到服务器端的socket对象,即: conn,address = socket.accept()
:param msg_bytes: 向客户端发送的字节
:return:"""
importstruct
token= b"\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
conn.send(msg)returnTruedefrun():
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
sock.bind(('0.0.0.0', 8003))
sock.listen(5)
conn, address=sock.accept()print(address)
data= conn.recv(1024)print(data)
headers=get_headers(data)
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"value= headers['Sec-WebSocket-Key'] + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'ac= 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'))whileTrue:try:
info= conn.recv(8096)exceptException as e:
info=Noneif notinfo:breakpayload_len= info[1] & 127
if 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=None
mask= info[2:6]
decoded= info[6:]
bytes_list=bytearray()for i inrange(len(decoded)):
chunk= decoded[i] ^ mask[i % 4]
bytes_list.append(chunk)
body= str(bytes_list, encoding='utf-8')importsubprocess
p= subprocess.Popen('ping -c5 www.baidu.com', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
lines=[]for line in iter(p.stdout.readline, b''):
line= line.rstrip().decode('utf8')
send_msg(conn, line.encode('utf-8'))
sock.close()if __name__ == '__main__':
run()
View Code
客户端:
$(function() {varsocket= newWebSocket("ws://127.0.0.1:8003");
$('#backup_all').click(function() {
console.log(window.location.host)
console.log(socket);//socket.onopen = function () {
//console.log('WebSocket open');//成功连接上Websocket
//socket.send('ls');//发送数据到服务端
//};
socket.send('ls');
console.log('WebSocket open');//成功连接上Websocket
socket.onmessage= function(e) {
console.log('message:' +e.data);//打印服务端返回的数据
//$('#messagecontainer').prepend('
' + e.data + '
');
//$('#messagecontainer').prepend('
');
$('#messagecontainer').append(e.data+'
');
};
});
});
执行Shell脚本
脚本执行结果:
python web页面输出_python+socket+jq实现web页面实时输出结果相关推荐
- python做大型网站_Python中的大型Web应用:一个好的架构
如果你着手使用关系型数据库在Python中编写大型应用程序,这篇长文正好满足你的需求.这里我分享下在一个大型团队中使用SQLAlchemy(Python语言中提供最先进ORM工具的软件)编写超过6个月 ...
- python语言格式化输出_Python format()格式化输出方法详解
原标题:Python format()格式化输出方法详解 format() 方法的语法格式如下: str.format(args) 此方法中,str 用于指定字符串的显示样式:args 用于指定要进行 ...
- python的print输出_python中的print()输出
1.普通的输出: print(str)#str是任意一个字符串,数字・・・ 2.格式化输出: print('1,2,%s,%d'%('asd',4)) 1,2,asd,4 与C语言有点类似 3.其它: ...
- python字符串反向输出_Python反向字符串– 5种方法和最佳方法
python字符串反向输出 Python String doesn't have a built-in reverse() function. However, there are various w ...
- python逆序输出_python倒序输出
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python列表倒序输出及其效率方法一使用python内置函数reversed( ...
- python中文格式化输出_python format 格式化输出方法
python format 格式化输出方法 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: python format 格式化输出方法.txt ] (友情提示:右键 ...
- python田字格的输出_python用函数输出田字格
用python输出田字格,有两种办法: 第一种使用print函数 代码如下print("+-----+-----+") print("+ + +") print ...
- python怎样换行输出_python换行输出
如何用python将内容换行输出 这样我输入"欢迎来到CSS布局HTML"后, 1.txt中的原内容" 我好 欢迎来到CSS布局HTML 大家好 " 变成了&q ...
- 用来向登录页面输出验证码图片的一般处理程序页面
这是自己以前做的B/S项目中的一个输出验证码图片的页面,没什么技术含量,希望高手们不要嘲笑,只是希望为需要帮助的人尽一点绵薄之力罢了! 页面简介:该页面是一个以ashx 为后缀的一般处理程序页面,用于 ...
最新文章
- 转载:有关SQL server connection Keep Alive 的FAQ(3)
- ngx对accept加锁操作
- oracle存储过程循环单列,Oracle存储过程循环语法实例分析
- 对比学习可以使用梯度累积吗?
- 《那些年啊,那些事——一个程序员的奋斗史》——35
- DNS(域名系统) 是什么
- vector二维的长度
- 系统学习 TypeScript(二)——开发流程和语法规则
- 东北大学 16春学期《实用写作》在线作业1-3 答案
- android仿饿了么筛选,Android仿饿了么搜索功能
- 图像识别技术的应用及发展趋势
- Android开发——监听Android手机的网络状态
- Unity3d之贴图融合
- KK 在 68 岁生日时给出的 68 条建议[翻译]#yyds干货盘点#
- 报表工具不可或缺的数据填报功能
- Python笔记_81_结算页面_订单模型_优惠券
- Python计算机视觉编程第十章——OpenCV基础知识
- 初识项目与项目管理-1
- react实现Modal弹窗
- 【liteOS】小白进阶之移植 LiteOS 到 STM32
热门文章
- 新疆那些大学在计算机专业好,新疆哪些二本大学的计算机科学与技术专业最好?...
- signature=eddfa127dafaf9a7c1ea87598961fbc9,Slingerende vrachtwagens verleden tijd?
- mnn python 笔记
- torch.norm
- ONNX+TensorRT
- 在windows10上搭建caffe
- 树莓派3b与散热风扇
- mkl gt;=2018
- pycharm调试显示图片
- nethogs 查看 Linux 进程的网络使用