例如有这样一个需求:

在终端上进行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页面实时输出结果相关推荐

  1. python做大型网站_Python中的大型Web应用:一个好的架构

    如果你着手使用关系型数据库在Python中编写大型应用程序,这篇长文正好满足你的需求.这里我分享下在一个大型团队中使用SQLAlchemy(Python语言中提供最先进ORM工具的软件)编写超过6个月 ...

  2. python语言格式化输出_Python format()格式化输出方法详解

    原标题:Python format()格式化输出方法详解 format() 方法的语法格式如下: str.format(args) 此方法中,str 用于指定字符串的显示样式:args 用于指定要进行 ...

  3. python的print输出_python中的print()输出

    1.普通的输出: print(str)#str是任意一个字符串,数字・・・ 2.格式化输出: print('1,2,%s,%d'%('asd',4)) 1,2,asd,4 与C语言有点类似 3.其它: ...

  4. python字符串反向输出_Python反向字符串– 5种方法和最佳方法

    python字符串反向输出 Python String doesn't have a built-in reverse() function. However, there are various w ...

  5. python逆序输出_python倒序输出

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python列表倒序输出及其效率方法一使用python内置函数reversed( ...

  6. python中文格式化输出_python format 格式化输出方法

    python format 格式化输出方法 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  python format 格式化输出方法.txt ] (友情提示:右键 ...

  7. python田字格的输出_python用函数输出田字格

    用python输出田字格,有两种办法: 第一种使用print函数 代码如下print("+-----+-----+") print("+ + +") print ...

  8. python怎样换行输出_python换行输出

    如何用python将内容换行输出 这样我输入"欢迎来到CSS布局HTML"后, 1.txt中的原内容" 我好 欢迎来到CSS布局HTML 大家好 " 变成了&q ...

  9. 用来向登录页面输出验证码图片的一般处理程序页面

    这是自己以前做的B/S项目中的一个输出验证码图片的页面,没什么技术含量,希望高手们不要嘲笑,只是希望为需要帮助的人尽一点绵薄之力罢了! 页面简介:该页面是一个以ashx 为后缀的一般处理程序页面,用于 ...

最新文章

  1. 转载:有关SQL server connection Keep Alive 的FAQ(3)
  2. ngx对accept加锁操作
  3. oracle存储过程循环单列,Oracle存储过程循环语法实例分析
  4. 对比学习可以使用梯度累积吗?
  5. 《那些年啊,那些事——一个程序员的奋斗史》——35
  6. DNS(域名系统) 是什么
  7. vector二维的长度
  8. 系统学习 TypeScript(二)——开发流程和语法规则
  9. 东北大学 16春学期《实用写作》在线作业1-3 答案
  10. android仿饿了么筛选,Android仿饿了么搜索功能
  11. 图像识别技术的应用及发展趋势
  12. Android开发——监听Android手机的网络状态
  13. Unity3d之贴图融合
  14. KK 在 68 岁生日时给出的 68 条建议[翻译]#yyds干货盘点#
  15. 报表工具不可或缺的数据填报功能
  16. Python笔记_81_结算页面_订单模型_优惠券
  17. Python计算机视觉编程第十章——OpenCV基础知识
  18. 初识项目与项目管理-1
  19. react实现Modal弹窗
  20. 【liteOS】小白进阶之移植 LiteOS 到 STM32

热门文章

  1. 新疆那些大学在计算机专业好,新疆哪些二本大学的计算机科学与技术专业最好?...
  2. signature=eddfa127dafaf9a7c1ea87598961fbc9,Slingerende vrachtwagens verleden tijd?
  3. mnn python 笔记
  4. torch.norm
  5. ONNX+TensorRT
  6. 在windows10上搭建caffe
  7. 树莓派3b与散热风扇
  8. mkl gt;=2018
  9. pycharm调试显示图片
  10. nethogs 查看 Linux 进程的网络使用