Python入門學習-DAY32-鏈接循環與通信循環,粘包問題,遠程控制,文件上傳與下載
阿新 • • 發佈:2018-09-03
stderr 數據 tor sts pfile int 長度 stdout net
鏈接循環與通信循環
服務端
from socket import * IP = ‘127.0.0.1‘ PORT = 8181 ADDRESS = (IP, PORT) BUFSIZE = 1024 server = socket(AF_INET, SOCK_STREAM) server.bind(ADDRESS) server.listen(5) tag=True while tag: conn, addr = server.accept() while tag: try: data = conn.recv(BUFSIZE)if not data: print(‘服務端斷開。。。‘) break print(‘>>>>‘,data.decode(‘utf-8‘)) conn.send(‘收到‘.encode(‘utf-8‘)) except ConnectionResetError: break conn.close() server.close()
客戶端
import socket IP=‘127.0.0.1‘ PORT=8181 ADDRESS=(IP,PORT) BUFSIZE=1024 client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(ADDRESS) while True: msg=input(‘>>>‘) if len(msg) == 0: continue client.send(msg.encode(‘utf-8‘)) data=client.recv(BUFSIZE) print(data.decode(‘utf-8‘)) client.close()
遠程控制
服務端
import socket import subprocess IP = ‘192.168.13.126‘ PORT = 8282 ADDRESS = (IP, PORT) BUFSIZE = 1024 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(ADDRESS) server.listen(5) tag=True while tag: conn, addr = server.accept() while tag: try: data = conn.recv(BUFSIZE) if not data: print(‘服務端斷開。。。‘) break #獲取sub對象 res = subprocess.Popen(data.decode("utf-8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) print(‘>>>>‘,data.decode(‘utf-8‘)) stdout=res.stdout.read() stderr=res.stderr.read() conn.send(stdout+stderr) except ConnectionResetError: break conn.close() server.close()
客戶端
import socket IP=‘127.0.0.1‘ PORT=8282 ADDRESS=(IP,PORT) BUFSIZE=1024 client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(ADDRESS) while True: msg=input(‘>>>‘) if len(msg) == 0: continue client.send(msg.encode(‘utf-8‘)) data=client.recv(BUFSIZE) print(data.decode(‘gbk‘)) client.close()
粘包問題
服務端
import socket import subprocess import struct import json IP = ‘127.0.0.1‘ PORT = 8383 ADDRESS = (IP, PORT) BUFSIZE = 1024 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(ADDRESS) server.listen(5) tag = True while tag: conn, addr = server.accept() while tag: try: data = conn.recv(BUFSIZE) if not data: print(‘服務端斷開。。。。‘) break # 獲取sub對象 res = subprocess.Popen(data.decode("utf-8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) print(‘>>>>‘, data.decode(‘utf-8‘)) # 成功的結果 stdout = res.stdout.read() # 失敗的結果 stderr = res.stderr.read() # 1.制作報頭 header_dic = { ‘filename‘: ‘a.txt‘, ‘md5‘: ‘sd7a86d87sad6as‘, ‘total_size‘: len(stdout) + len(stderr) } header_json = json.dumps(header_dic) header_bytes = header_json.encode(‘utf-8‘) # 2.先發送報頭長度 conn.send(struct.pack(‘i‘, len(header_bytes))) # 3.再發送報頭 conn.send(header_bytes) # 4.最後發送數據 conn.send(stdout) conn.send(stderr) except ConnectionResetError: break conn.close() server.close()
客戶端
import socket import struct import json IP = ‘127.0.0.1‘ PORT = 8383 ADDRESS = (IP, PORT) BUFSIZE = 1024 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(ADDRESS) while True: msg = input(‘>>>‘) if len(msg) == 0: continue client.send(msg.encode(‘utf-8‘)) # 1.先獲取報頭長度 header_size = struct.unpack(‘i‘,client.recv(4))[0] #2.在獲取報頭 header_bytes=client.recv(header_size) header_json=header_bytes.decode(‘utf-8‘) header_dic=json.loads(header_json) print(header_json) total_size=header_dic[‘total_size‘] # 3.在獲取真正數據 cmd_res=b‘‘ recv_size=0 while recv_size<total_size: data=client.recv(1024) recv_size+=len(data) cmd_res+=data print(cmd_res.decode(‘gbk‘)) client.close()
文件上傳與下載
common
import json, struct, os def accept(type, obj): res = obj.recv(1).decode(‘utf-8‘) if res == ‘1‘: # 1.先獲取報頭長度 header_size = struct.unpack(‘i‘, obj.recv(4))[0] # 2.在獲取報頭 header_bytes = obj.recv(header_size) # 接受字節型的報頭 header_json = header_bytes.decode(‘utf-8‘) # 將字節型的報頭轉化為原先的JSON格式 header_dic = json.loads(header_json) # 將JSON格式的報頭轉化為原先的字典 total_size = header_dic[‘total_size‘] print(header_dic) # 3.在獲取真正數據 recv_size = 0 # 設置存放文件的路徑 if type == ‘server‘: file_path = os.path.join(r‘C:\Users\Administrator\Desktop\服務端文件中心\%s‘ % header_dic[‘filename‘]) elif type == ‘client‘: file_path = os.path.join(r‘C:\Users\Administrator\Desktop\客戶端文件中心\%s‘ % header_dic[‘filename‘]) # 判斷文件內容是否為空 if total_size != 0: while (recv_size < total_size): data = obj.recv(10240) recv_size += len(data) with open(file_path, ‘wb‘) as f: f.write(data) else: f = open(file_path, ‘wb‘) f.close() return True else: return False def transfer(obj, filename): if os.path.exists(filename): obj.send(‘1‘.encode(‘utf-8‘)) filepath, tempfilename = os.path.split(filename) # 1.制作報頭 header_dic = { ‘filename‘: tempfilename, ‘total_size‘: os.stat(filename).st_size } header_json = json.dumps(header_dic)#將字典格式序列化為json方便傳送 header_bytes = header_json.encode(‘utf-8‘)#只能傳送bytes類型,所以要轉化為bytes類型 print(header_dic) # 2.先發送報頭長度 obj.send(struct.pack(‘i‘, len(header_bytes))) # 3.再發送報頭 obj.send(header_bytes) # 4.最後發送數據 with open(filename, ‘rb‘) as f: for i in f: obj.send(i) return True else: obj.send(‘0‘.encode(‘utf-8‘)) return False
服務端
import socket import common def run(): IP = ‘127.0.0.1‘ PORT = 8484 ADDRESS = (IP, PORT) BUFSIZE = 1024 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(ADDRESS) server.listen(5) tag = True while tag: conn, addr = server.accept() while tag: try: data = conn.recv(BUFSIZE) if not data: print("客戶端已斷開。。。") break cmd, filename = data.decode("utf-8").split( ) print(‘>>>>‘, data.decode(‘utf-8‘)) if cmd==‘1‘: flag=common.accept(‘server‘,conn) if flag: print(‘接受成功‘) else: print(‘接受失敗‘) elif cmd==‘2‘: flag=common.transfer(conn, filename) if flag: print(‘傳送成功‘) else: print(‘傳送失敗‘) except ConnectionResetError: break conn.close() server.close() run()
客戶端
import socket import common def run(): IP = ‘127.0.0.1‘ PORT = 8484 ADDRESS = (IP, PORT) client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(ADDRESS) print(‘‘‘ 1.上傳 2.下載 ‘‘‘) while True: msg = input(‘>>>(1/2):‘) if len(msg) == 0: continue if msg!=‘1‘ and msg!=‘2‘: print(‘指令錯誤‘) continue filename=input(‘文件地址:‘) client.send((msg+‘ ‘+filename).encode(‘utf-8‘)) if msg == ‘1‘: flag=common.transfer(client, filename) if flag: print(‘上傳成功‘) else: print(‘上傳失敗‘) elif msg == ‘2‘: flag=common.accept(‘client‘,client) if flag: print(‘下載成功‘) else: print(‘下載失敗‘) client.close() run()
Python入門學習-DAY32-鏈接循環與通信循環,粘包問題,遠程控制,文件上傳與下載