服务端:
1 #!/usr/bin/env python3 2 #-*- coding:utf-8 -*- 3 ''' 4 Administrator 5 2018/8/1 6 ''' 7 import subprocess 8 import socket,os 9 10 # 创建一个socket: 11 #family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None 12 #创建Socket时,AF_INET指定使用IPv4协议, 13 # 如果要用更先进的IPv6,就指定为AF_INET6 14 # AF_UNIX Unix不同进程之间的通信 15 # SOCK_STREAM指定使用面向流的TCP协议 SOCK_DGRAM UDP协议 16 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 17 print(s) 18 address=('127.0.0.1',8000) 19 #建立连接 20 s.bind(address) 21 #监听设置端口等待客户端的请求数量 22 s.listen(3) 23 24 25 print('等待...........') 26 BASE_DIR=os.path.dirname(os.path.abspath(__file__)) 27 28 while True: 29 # accept 阻塞 30 conn, addr = s.accept() 31 print(addr) 32 while True: 33 data=conn.recv(1024) 34 cmd,filename,filesize=str(data,"utf8").split("|") 35 path=os.path.join(BASE_DIR,"img",filename) 36 filesize=int(filesize) 37 38 f=open(path,"wb") 39 40 get_sent=0 41 while get_sent != filesize: 42 data=conn.recv(1024) 43 get_sent+=len(data) 44 f.write(data) 45 print("接受完毕。") 46 f.close() 47 48 49 s.close()
客户端:
1 #!/usr/bin/env python3 2 # -*- coding:utf-8 -*- 3 ''' 4 Administrator 5 2018/8/1 6 ''' 7 import socket,os,sys 8 9 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 10 print(sck) 11 address = ('127.0.0.1', 8000) #192.168.0.103 12 sck.connect(address) 13 14 BASE_DIR=os.path.dirname(os.path.abspath(__file__)) 15 while True: 16 inp = input(">>>").strip()#post|kanqingzi.jpg 17 18 cmd,path=inp.split("|") 19 path=os.path.join(BASE_DIR,path)#拼接路径 20 21 filename=os.path.basename(path)#需要文件名字 22 filesize=os.stat(path).st_size#需要文件大小 23 #文件打包 24 file_info="post|%s|%s"%(filename,filesize)#字符串拼接 25 sck.sendall(bytes(file_info,"utf8")) 26 27 with open(path,"rb") as f: 28 has_sent=0 29 while has_sent !=filesize: 30 data=f.read(1024) 31 sck.sendall(data) 32 has_sent+=len(data) 33 print("上传成功!!!") 34 35 sck.close()
练习:远程控制对方电脑,并将对方电脑里面的图片发送过来。
客户端::
1 #!/usr/bin/env python3 2 #-*- coding:utf-8 -*- 3 ''' 4 Administrator 5 2018/8/2 6 ''' 7 import socket,os,re 8 9 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 10 print(sck) 11 address = ('127.0.0.1', 8000) #192.168.0.103 12 sck.connect(address) 13 14 BASE_DIR=os.path.dirname(os.path.abspath(__file__)) 15 while True: 16 inp = input(">>>").strip()#post|kanqingzi.jpg load|jpg 17 if "|" in inp: 18 cmd,path=inp.split("|") 19 20 if cmd=="post": #上传文件post|jgp 21 path=os.path.join(BASE_DIR,path)#拼接路径 22 23 filename=os.path.basename(path)#需要文件名字 24 filesize=os.stat(path).st_size#需要文件大小 25 #文件打包 26 file_info="post|%s|%s"%(filename,filesize)#字符串拼接 27 sck.sendall(bytes(file_info,"utf8")) 28 29 with open(path,"rb") as f: 30 has_sent=0 31 while has_sent !=filesize: 32 data=f.read(1024) 33 sck.sendall(data) 34 has_sent+=len(data) 35 print("图片%s上传成功!!!"%filename) 36 elif cmd=="load": #下载文件 #load|././././xx.jpg 要输入图片绝对路径 37 sck.send(inp.encode('utf-8')) 38 data=sck.recv(1024) 39 cmd, filename, filesize = str(data,"utf8").split("|") 40 if cmd == "load": # 再次确认是下载命令 41 path = os.path.join(BASE_DIR, "img_recv", filename) 42 filesize = int(filesize) 43 f = open(path, "wb") 44 get_sent = 0 45 while get_sent != filesize: 46 data_s = sck.recv(1024) 47 get_sent += len(data_s) 48 f.write(data_s) 49 print("接受图片%s。" % filename) 50 f.close() 51 52 53 else: # 远程操控,给服务端输入命令 54 sck.send(inp.encode('utf-8')) 55 result_len = int(str(sck.recv(1024), "utf-8")) # 先接受二进制的长度 56 # sck.send("") 57 print(result_len) 58 59 data = bytes() 60 while len(data) != result_len: 61 recv = sck.recv(1024) 62 data += recv 63 print(str(data, "gbk", errors="ignore")) 64 65 sck.close()
服务端:
1 #!/usr/bin/env python3 2 #-*- coding:utf-8 -*- 3 ''' 4 Administrator 5 2018/8/2 6 ''' 7 import subprocess 8 import socket,os 9 10 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 11 print(s) 12 address=('127.0.0.1',8000) 13 s.bind(address) 14 s.listen(3) 15 print('等待...........') 16 BASE_DIR=os.path.dirname(os.path.abspath(__file__)) 17 18 while True: 19 conn, addr = s.accept() 20 print(addr) 21 while True: 22 ################################接受数据 cd post|..... ##################################### 23 try: 24 data = conn.recv(1024) 25 except Exception: 26 break 27 if not data: 28 conn.close() 29 break 30 data_l=str(data,"utf8") 31 if "|" in data_l: 32 if len(data_l.split("|"))==3:#切开后有三个参数 33 cmd,filename,filesize=data_l.split("|") #有时候两个参数,有时候三个参数 34 ################################ 判断是下载 load 还是上传 post ########################################### 35 if cmd=="post": #上传 36 path=os.path.join(BASE_DIR,"img",filename) 37 filesize=int(filesize) 38 f=open(path,"wb") 39 get_sent=0 40 while get_sent != filesize: 41 data_s=conn.recv(1024) 42 get_sent+=len(data_s) 43 f.write(data_s) 44 print("接受图片%s。"%filename) 45 f.close() 46 elif len(data_l.split("|"))==2: #下载 47 cmd, path = data_l.split("|")###得到load | 图片绝对路径 48 if cmd=="load": 49 filename = os.path.basename(path) # 需要文件名字 50 filesize = os.stat(path).st_size # 需要文件大小 51 # 文件打包 52 file_info = "load|%s|%s" % (filename, filesize) # 字符串拼接 53 conn.sendall(bytes(file_info, "utf8")) 54 with open(path, "rb") as f: 55 has_sent = 0 56 while has_sent != filesize: 57 data = f.read(1024) 58 conn.sendall(data) 59 has_sent += len(data) 60 print("图片%s上传成功!!!" % filename) 61 else: #执行cmd命令 远程控制 62 obj = subprocess.Popen(data_l, shell=True, stdout=subprocess.PIPE) 63 64 info = obj.stdout.read() # 取到执行后得到的结果二进制 65 result_len = bytes(str(len(info)), "utf8") 66 conn.send(result_len) 67 68 conn.sendall(info) 69 70 71 72 s.close()