python 作业 socket 执行命令+FTP上传
1. 执行命令
服务端:
#!/usr/bin/env python # --*-- encoding:utf-8 --*-- import socketserver import subprocess # sscok = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # sscok.bind(('127.0.0.1',9999,)) # sscok.listen(5) # while True: # conn,addr = sscok.accept() # conn.sendall(bytes('欢迎使用远程命令',encoding='utf-8')) # conn.close() # sscok.close() class myserver(socketserver.BaseRequestHandler): def handle(self): conn = self.request addr = self.client_address conn.sendall(bytes('欢迎使用远程命令',encoding='utf-8')) while True: print('等待接受CMD') try: data_byte = conn.recv(1024) except Exception as e: break data_str = str(data_byte,encoding='utf-8') try: res = subprocess.check_output(data_str,shell=True) except Exception as e: conn.sendall(bytes('error cmd',encoding='utf-8')) continue else: conn.sendall(bytes(str(len(res)),encoding='utf-8')) print(str(conn.recv(1024),encoding='utf-8')) #粘包问题 conn.sendall(res) conn.close() if __name__ == '__main__': server = socketserver.ThreadingTCPServer(('127.0.0.1',9999,),myserver) server.serve_forever()
客户端
#!/usr/bin/env python # --*-- encoding:utf-8 --*-- import socket csock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) csock.connect(('127.0.0.1',9999,)) data =csock.recv(1024) print(str(data,encoding='utf-8')) while True: ml = input("请输入要执行的CMD命令:") csock.sendall(bytes(ml,encoding='utf-8')) data_byte = csock.recv(1024) data_str = str(data_byte,encoding='utf-8') if data_str=='error cmd': print('错误的命令') else: csock.sendall(bytes('ack',encoding='utf-8')) recv_size = 0 recv_data =bytes() while recv_size< int(data_str): data = csock.recv(1024) recv_data +=data recv_size +=len(data) print(str(recv_data, encoding='gbk')) csock.close()
2.FTP上传 +断点上传
服务端
#!/usr/bin/env python # --*-- encoding:utf-8 --*-- import socketserver import os class myserver(socketserver.BaseRequestHandler): def handle(self): print('wait for connect.......') conn = self.request addr = self.client_address conn.sendall(bytes('欢迎使用FTP',encoding='utf-8')) while True: try: file_recv_byte =conn.recv(1024) except Exception as e: break file_recv_str =str(file_recv_byte,encoding='utf-8') base_dir = os.path.dirname(__file__) load_path = os.path.join(base_dir,file_recv_str) if not os.path.exists(os.path.dirname(load_path)): os.mkdir(os.path.dirname(load_path)) if os.path.exists(load_path): conn.sendall(bytes('exists',encoding='utf-8')) pos_file_size = os.stat(load_path).st_size file_size = int(str(conn.recv(1024),encoding='utf-8')) if file_size == pos_file_size: conn.sendall(bytes('已存在',encoding='utf-8')) else: conn.sendall(bytes('可以续传', encoding='utf-8')) if str(conn.recv(1024),encoding='utf-8')=='续传': conn.sendall(bytes(str(pos_file_size),encoding='utf-8')) with open(load_path, 'ab') as f: recv_size = pos_file_size while recv_size < file_size: try: data = conn.recv(1024) except Exception as e: break f.write(data) recv_size += len(data) else: conn.sendall(bytes('not exists', encoding='utf-8')) with open(load_path,'wb') as f: data = conn.recv(1024) recv_size = 0 file_size = int(str(data,encoding='utf-8')) conn.sendall(bytes('ack',encoding='utf-8')) while recv_size< file_size: try: data = conn.recv(1024) except Exception as e: break f.write(data) recv_size += len(data) conn.close() if __name__ == '__main__': server = socketserver.ThreadingTCPServer(('127.0.0.1',9999),myserver) server.serve_forever()
客户端
#!/usr/bin/env python # --*-- encoding:utf-8 --*-- import socket import os import sys import time def show_bar(now_size,total_size): sys.stdout.write('\r') tem_f = now_size/total_size tem_d = round(tem_f*100) sys.stdout.write('%s | %0.2f%% '%('>'*tem_d,tem_f*100)) sys.stdout.flush() time.sleep(0.0001) csock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) csock.connect(('127.0.0.1',9999)) data = csock.recv(1024) print(str(data,encoding='utf-8')) while True: file = input('请输入要上传的文件:') file_path = input('请输入要存储路径:') file_send =os.path.join(file_path,file) csock.sendall(bytes(file_send,encoding='utf-8')) file_size = os.stat(file).st_size if str(csock.recv(1024),encoding='utf-8')=='exists': csock.sendall(bytes(str(file_size), encoding='utf-8')) flag = csock.recv(1024) if str(flag,encoding='utf-8')=='已存在': print('文件已经存在') csock.sendall(bytes('结束',encoding='utf-8')) else: csock.sendall(bytes('续传',encoding='utf-8')) pos_file_size=int(str(csock.recv(1024),encoding='utf-8')) print(pos_file_size) with open(file,'rb') as f: has_send_size = pos_file_size f.seek(pos_file_size) for line in f: csock.sendall(line) has_send_size += len(line) show_bar(has_send_size, file_size) print('上传成功') else: csock.sendall(bytes(str(file_size),encoding='utf-8')) csock.recv(1024)#收到确认消息 with open(file,'rb') as f: has_send_size = 0 for line in f: csock.sendall(line) has_send_size +=len(line) show_bar(has_send_size,file_size) print('上传成功') csock.close()

浙公网安备 33010602011771号