1.cmd命令 利用socket

socket服务端

 import socket
import subprocess
s = socket.socket()
s.bind(("127.0.0.1",8000))
s.listen(3)
print("waiting...")
while 1:
conn,addr = s.accept()
print(conn)
while 1:
try:
a = conn.recv(1024)
except Exception:
break
if not a:
break
print(">>>",str(a,"utf8"))
obj = subprocess.Popen(a.decode("utf8"),shell=True,stdout=subprocess.PIPE)
result = obj.stdout.read()
print('ooooo',type(result))
result_len = bytes(str(len(result)),"utf8") # result是unicode编码下的十六进制 所以先转换成字符串(Unicode) 在转换成bytes
conn.sendall(result_len) # 两个send在一起容易发生粘包 特别是第一个数据特别小的时候
conn.sendall(result) # 所以在send之间在来个一收一发
s.close()

client客户端

 import socket
s = socket.socket()
ss = ("127.0.0.1",8000)
s.connect(ss)
while 1:
inp = input(">>>")
if inp =="q":
break
s.send(bytes(inp,"utf8")) # send 传送智能是bytes类型
result_len = int(str(s.recv(1024),"utf8")) # 二进制的不能直接转换成整形!!!
print(result_len)
data = bytes()
while len(data)!=result_len: # 大文件传输过程中 不能一次传完 造成延迟 所以要先
data += s.recv(1024) # 传输文件的大小 根据大小判断文件传输
print(str(data,"gbk"))
s.close()

上述的代码实现了client端发送cmd指令到serve端进行执行后返回给client端结果的一个过程。

attention:一发一收

socket创建

  s = socket.socket()这样就创建了一个socket对象。在serve端和client端分别需要创建一个。括号中仍有4个默认函数:

  family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None

  其中family是IPV4 的默认值,type是TCP的默认值。

设置值

  创建好socket之后,serve端需要设置(4,5行)

  1 bind绑定IP和端口。

  2 listening值是最多等待。

  3 接受client协议和地址 即 第八行

  4 注意这里的conn就是client端的.socket 所以在接收的时候为conn.receive

  client端只用设置连接的address和端口。

小细节

  1.serve端的try是防止client端直接结束造成接收报错。

  2.若接收的a为空表示client端主动断开了socket连接(本身发送不能发送空)。

关于subprocess

  obj = subprocess.Popen(a.decode("utf8"),shell=True,stdout=subprocess.PIPE)
  result = obj.stdout.read()

  这两句话实现了cmd在子程序中运行后返回结果到result。

  注意这里的result是gbk编码下的bytes类型。

关于这其中杂乱的编码

  Python3中有两种格式:

    str:str>>bytes 称为编码(encode)方法有1.re=bytes(“ccc”,“utf8”)2.re=“ccc”.encode(“utf8”)py3中str都是Unicode编码。兼容utf8,三字节表示中文。

    bytes:bytes>>str称为解码(decode)方法有1.re = str(“ccc”,“utf8”)2.re=“ccc”.decode(“utf8”)bytes类型有相对应的编码协议。即什么样的编码形式               (如utf8)就仍用什么样的解码。

  Python2中也有两种:

    str:即原来的3中的bytes

    Unicode:即str u“你好” 表示内容用的Unicode编码。

  pyhton3中页面用到utf8,2中用的阿斯克码。

大文件传输问题解决

  发送端的sendall必将数据都发送过去,但是接收的时候一次最多接收设置值1024个字节。(received值最大8K)所以造成接收时显示缓慢。(接收第二条时仍旧显示第      一条)

  解决办法是:多次循环接收直到data大小等于文件大小。while len(data)!=result_len:不相等就继续接收。

2.socketserve

serve端

 import socketserver
class Myserve(socketserver.BaseRequestHandler):
def handle(self):
print("active")
while 1:
conn = self.request
print(self.client_address)
while 1:
a = conn.recv(1024)
print(">>>", str(a, "utf8"))
if not a:
break
inp = input(">>>")
conn.send(bytes(inp, "utf8"))
conn.close()
mine = socketserver.ThreadingTCPServer(("127.0.0.1",8000),Myserve)
mine.serve_forever()

上述通过调用socketserver实现了多个client和一个server进行通信的功能。

实现过程:

  创建一个自己命名的server类myserver

  只在此类中创建一个方法:handle名字不能变,逻辑按照功能设计

  创建socketserver对象,调用ThreadingTCPServer方法传入address元组,和server。

  serverforever()激活这个并发的server。

  

socketserve及其应用的更多相关文章

  1. socket-自我总结(2)

    这里总结下一个服务端与多个客户端之间的通信. 先看demo: #/usr/bin/env python #_*_coding:utf-8_*_ __author__ = 'ganzl' import ...

  2. iOS开发之AsyncSocket使用教程

    用socket可以实现像QQ那样发送即时消息的功能.客户端和服务端需要建立长连接,在长连接的情况下,发送消息.客户端可以发送心跳包来检测长连接. 在iOS开发中使用socket,一般都是用第三方库As ...

  3. CocoaAsyncSocket框架的简单封装

    在iOS开发中使用socket(CFNetwork),一般都是用第三方库AsyncSocket. 参考博客:http://my.oschina.net/worldligang/blog/396881? ...

  4. [py]python的继承体系-源码目录结构

    python3安装目录 pip install virtualenv pip install virtualenvwrapper pip install virtualenvwrapper-win m ...

  5. [py]python的继承体系

    python的继承体系 python中一切皆对象 随着类的定义而开辟执行 class Foo(object): print 'Loading...' spam = 'eggs' print 'Done ...

  6. 网络编程进阶---->>> hamc模块 socketserver模块验证合法性 两者进行通信连接

    我们在工作中经常遇到,你公司内的某一台电脑要去访问你的服务器或者一个服务端电脑,那么你是让每一台都进行连接吗?  那不可能的  你肯定要进行限定的 验证客户端链接的合法性: hamc模块 hamc也是 ...

  7. python--(socket与粘包解决方案)

    python--(socket与粘包解决方案) 一.socket: Socket 是任何一种计算机网络通讯中最基础的内容.例如当你在浏览器地址栏中输入 http://www.cnblogs.com/ ...

  8. Apache Log4j 反序列化代码执行(CVE-2019-17571) 漏洞分析

    Apache Log4j 漏洞分析 仅用于研究漏洞原理,禁止用于非法用途,后果自负!!! CVE-2019-17571 漏洞描述 Log4j是美国阿帕奇(Apache)软件基金会的一款基于Java的开 ...

  9. Python网络编程基础 PDF 完整超清版|网盘链接内附提取码下载|

    点此获取下载地址提取码:y9u5 Python网络编程最好新手入门书籍!175个详细案例,事实胜于雄辩,Sockets.DNS.Web Service.FTP.Email.SMTP.POP.IMAP. ...

随机推荐

  1. PO3281 Dining(最大流)

    如果只有食物或者饮料那就是个二分图最大匹配. 三个真想不出来..然后看题解..从源点到食物到牛到饮料到汇点,这样建图. 所以思维不能太局限了,不懂得把食物和饮料放到牛两边,以为牛吃食物饮料.食物饮料被 ...

  2. POJ1659 Frogs' Neighborhood(Havel定理)

    给一个无向图的度序列判定是否可图化,并求方案: 可图化的判定:d1+d2+……dn=0(mod 2).关于具体图的构造,我们可以简单地把奇数度的点配对,剩下的全部搞成自环. 可简单图化的判定(Have ...

  3. 【BZOJ】1452: [JSOI2009]Count

    http://www.lydsy.com/JudgeOnline/problem.php?id=1452 题意:n×m的矩阵上每个点有个颜色,现在有q个操作:1 x y c 将点(x,y)的颜色改为c ...

  4. 【BZOJ】1089: [SCOI2003]严格n元树(递推+高精度/fft)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1089 题意:求深度为d的n元树数目.(0<n<=32, 0<=d<=16) ...

  5. mysql的jdbc入门学习小结

    转自:专注JavaWeb开发 http://www.javaweb1024.com/data/MySQL/2015/04/25/618.html 一.jdbc基本概念jdbc : Java Datab ...

  6. spark-submit [options]

    执行时需要传入的参数说明如下: Usage: spark-submit [options] <app jar | python file> [app options] 参数名称 含义 -- ...

  7. php中alert弹出时单双引号问题

    php代码中单双引号问题是个很重要的问题,使用不当会造成很多麻烦.先记录一下今天写alert遇到的麻烦.我做登录的时候,成功时想弹出个提示说登录成功.写alert语句时不显示.其实就是单双引号弄得不对 ...

  8. fastjson 常用api

    一.json字符串的数据解析      1.json字符串 ---> JSONObject或者JSONArray[好处就是当你没有bean的model类时,可以直接获取相关数据]         ...

  9. Task Scheduler Error and Success Constants (Windows)

    If an error occurs, the Task Scheduler APIs can return one of the following error codes as an HRESUL ...

  10. POJ 3254 Corn Fields(状压DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13732   Accepted: 7216 Desc ...