网络通信   socket

这一节太难了,还是看TA的吧

http://www.cnblogs.com/alex3714/articles/5830365.html

  1. 不能执行top等类似的 会持续输出的命令,这是因为,服务器端在收到客户端指令后,会一次性通过os.popen执行,并得到结果后返回给客户,但top这样的命令用os.popen执行你会发现永远都不会结束,所以客户端也永远拿不到返回。(真正的ssh是通过select 异步等模块实现的,我们以后会涉及)
  2. 不能执行像cd这种没有返回的指令, 因为客户端每发送一条指令,就会通过client.recv(1024)等待接收服务器端的返回结果,但是cd命令没有结果 ,服务器端调用conn.send(data)时是不会发送数据给客户端的。 所以客户端就会一直等着,等到天荒地老,结果就卡死了。解决的办法是,在服务器端判断命令的执行返回结果的长度,如果结果为空,就自己加个结果返回给客户端,如写上"cmd exec success, has no output."
  3. 如果执行的命令返回结果的数据量比较大,会发现,结果返回不全,在客户端上再执行一条命令,结果返回的还是上一条命令的后半段的执行结果,这是为什么呢?这是因为,我们的客户写client.recv(1024), 即客户端一次最多只接收1024个字节,如果服务器端返回的数据是2000字节,那有至少9百多字节是客户端第一次接收不了的,那怎么办呢,服务器端此时不能把数据直接扔了呀,so它会暂时存在服务器的io发送缓冲区里,等客户端下次再接收数据的时候再发送给客户端。 这就是为什么客户端执行第2条命令时,却接收到了第一条命令的结果的原因。 这时有同学说了, 那我直接在客户端把client.recv(1024)改大一点不就好了么, 改成一次接收个100mb,哈哈,这是不行的,因为socket每次接收和发送都有最大数据量限制的,毕竟网络带宽也是有限的呀,不能一次发太多,发送的数据最大量的限制 就是缓冲区能缓存的数据的最大量,这个缓冲区的最大值在不同的系统上是不一样的, 我实在查不到一个具体的数字,但测试的结果是,在linux上最大一次可接收10mb左右的数据,不过官方的建议是不超过8k,也就是8192,并且数据要可以被2整除,不要问为什么 。anyway , 如果一次只能接收最多不超过8192的数据 ,那服务端返回的数据超过了这个数字怎么办呢?比如让服务器端打开一个5mb的文件并返回,客户端怎么才能完整的接受到呢?那就只能循环收取啦。

在开始解决上面问题3之前,我们要考虑,客户端要循环接收服务器端的大量数据返回直到一条命令的结果全部返回为止, 但问题是客户端知道服务器端返回的数据有多大么?答案是不知道,那既然不知道服务器的要返回多大的数据,那客户端怎么知道要循环接收多少次呢?答案是不知道,擦,那咋办? 总不能靠猜吧?呵呵。。。 当然不能,那只能让服务器在发送数据之前主动告诉客户端,要发送多少数据给客户端,然后再开始发送数据,yes, 机智如我,搞起。

先简单测试接收数据量大小

 1 import socket
 2 import os,subprocess
 3
 4
 5 server = socket.socket() #获得socket实例
 6 server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 7
 8 server.bind(("localhost",9998)) #绑定ip port
 9 server.listen()  #开始监听
10
11 while True: #第一层loop
12     print("等待客户端的连接...")
13     conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...
14     print("新连接:",addr )
15     while True:
16
17         data = conn.recv(1024)
18         if not data:
19             print("客户端断开了...")
20             break #这里断开就会再次回到第一次外层的loop
21         print("收到命令:",data)
22         #res = os.popen(data.decode()).read() #py3 里socket发送的只有bytes,os.popen又只能接受str,所以要decode一下
23         res = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE).stdout.read() #跟上面那条命令的效果是一样的
24         if len(res) == 0:
25             res = "cmd exec success,has not output!"
26         conn.send(str(len(res)).endcode("utf-8")) #发送数据之前,先告诉客户端要发多少数据给它
27         conn.sendall(res.encode("utf-8")) #发送端也有最大数据量限制,所以这里用sendall,相当于重复循环调用conn.send,直至数据发送完毕
28 29 server.close()

import socketclient = socket.socket()client.connect(("localhost",9998))while True:msg = input(">>:").strip()if len(msg) == 0:continueclient.send( msg.encode("utf-8") )res_return_size  = client.recv(1024) #接收这条命令执行结果的大小print("getting cmd result , ", res_return_size)total_rece_size = int(res_return_size)print(total_rece_size)#print(data.decode()) #命令执行结果

client.close()

转载于:https://www.cnblogs.com/otcsnow/p/6486569.html

Python学习记录之----网络通信(二)相关推荐

  1. Python学习记录day3

    2019独角兽企业重金招聘Python工程师标准>>> Python学习记录 day3 今天是银角大王武sir讲课.先回顾了上节课所学,然后讲到了面向对象思想. set set是一个 ...

  2. 【Python学习记录】Numpy广播机制(broadcast)

    ✨ 博客主页:小小马车夫的主页 ✨ 所属专栏:Python学习记录 文章目录 一.什么是Numpy广播机制 二.Numpy广播应用 三.Numpy广播规则 一.什么是Numpy广播机制 在Numpy. ...

  3. Python学习记录day6-反射、常用模块

    Python学习记录day6-反射.常用模块 @(学习)[python] Python学习记录day6-反射常用模块 反射 常用模块 1 sys System-specific parameters ...

  4. Opencv+Python学习记录9:掩膜(掩码)的使用(内附详细代码)

    一,基本概念 OpenCV中的很多函数都会指定一个掩模,也被称为掩码,例如: 计算结果=cv2.add(参数1,参数2,掩模) 当使用掩模参数时,操作只会在掩模值为非空的像素点上执行,并将其他像素点的 ...

  5. Python学习记录(一)PIL库对于图像操作方法的简单整理

    Python学习记录(一)PIL库对于图像操作方法的简单整理 首先对PIL库进行一个简单的介绍:Python图像库PIL(Python Image Library)是python的第三方图像处理库,由 ...

  6. 参数匹配模型——Python学习之参数(二)

    参数匹配模型--Python学习之参数(二) 文章目录 参数匹配模型--Python学习之参数(二) 位置参数:从左至右进行匹配 关键字参数:通过参数名进行匹配 默认参数:为没有传入值的参数定义参数值 ...

  7. Python学习记录——英文名修改成标准格式

    Python学习记录--英文名修改成标准格式 功能需求 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字.输入:['adam', 'LISA', 'barT'],输出:['Adam', ...

  8. python学习记录——容器篇

    容器 字符串 下标(索引) # 下表也称为是索引,是一个整型数字,可以是正数,也可以是负数 # 正数下标是从0开始的,表示第一个字符,-1表示最后一个字符 my_str = 'hello'h e l ...

  9. 蜗牛一步一步地往上爬的Python学习记录

    Python学习记录 前言 简介 基础知识 类型变量 高级特性 函数式编程 高阶函数 偏函数 装饰器decorator 匿名函数 前言 第一,绝对不断更: 第二,绝对认真写: 第三,绝对撰写的公正漂亮 ...

  10. Python学习记录:shapefile.Writer报错

    Python学习记录 shapefile.Writer报错 w=shapefile.Writer(r.shapeType)使用时报错 Exception: The target filepath 5 ...

最新文章

  1. 智能经济的动力,从人工智能到超级智能
  2. 4.1.6 文件的基本操作
  3. scss里的继承操作符@extend
  4. EIGRP stub SIA
  5. 网络语言不c,哪些网络用语不文明?
  6. Linux学习笔记019---Centos7下安装Maven
  7. 理解 RESTful
  8. 拓端tecdat|SAS用梯度提升回归树(GBDT)迁移学习预测抵押贷款拖欠风险和垃圾电子邮件数据
  9. Linux下7款最佳的开源视频播放器
  10. 计算机黑屏什么原因,教您电脑黑屏的原因是什么
  11. 分享8年开发经验,浅谈程序员职业规划
  12. 微信小程序 【给图片加上删除图标】
  13. 陈华钧等 | OpenKG区块链:构建可信开放的联邦知识图谱平台
  14. 如何利用新浪微博开放平台API获取新浪微博用户数据
  15. 发送端口25,465,587端口
  16. 黑客必用神器,网络抓包工具
  17. 如何成为一名合格的DBA
  18. idea中删除的东西如何找回来
  19. 八路DI八路DO,开关量远程IO模块,Modbus TCP数据采集模块 WJ90
  20. 汇编程序中的符号或标号地址

热门文章

  1. 推荐10个趣味实战项目,从零入门人工智能和数据分析,看这篇就够了
  2. 《Linux就该这么学》修正已知全部勘误,免费下载啦!
  3. Android中突发情况数据的保存和恢复
  4. 史上最详细的Studio教程二来啦
  5. 佳能hdr_佳能发布Cinema EOS系统首款RF卡口 4K数字电影摄影机EOS C70
  6. shell应用之下载rpm包
  7. 关于百度地图根据经纬度获取城市信息的接口
  8. 关于 free 命令显示内存使用情况问题
  9. Asp.Net Repeater控件绑定泛型ListT的用法
  10. 客户关系管理式的电子商务