socket模塊
實現簡單的遠程連接:
客戶端:
import socket client = socket.socket()#聲明socket類型,同時生成socke連接t對象 client.connect(('localhost',969)) #連接到localhost主機的6969端口上去 while True: msg = input(">>:").strip() if len(msg) == 0:continue client.send(msg.encode('utf-8'))#把編譯成utf-8的數據發送出去 data = client.recv(512)#接收數據 print("從服務器接收到的數據為:",data.decode()) client.close()
服務器端:
import socket import os server = socket.socket()#聲明socket類型,並且生成socket連接對象 server.bind(('localhost',969))#把服務器綁定到localhost的6969端口上 server.listen(5)#開始監聽 print("等待連接中……") while True: conn,addr = server.accept()#接收連接 print("***連接成功***") while True: data = conn.recv(512)#接收客戶發來的數據 print("接收到的命令為:",data) if not data: print("客戶斷開連接") break com = os.popen(data.decode()).read()#read()讀取內存地址的內容 print(data.decode())#輸出結果為字符串dir print(os.popen(data.decode()))#輸出結果為一個內存地址 #py3 里socket發送的只有bytes,os.popen又只能接受str,所以要decode一下 conn.sendall(com.encode('utf-8')) server.close()
稍微加強了下的遠程連接:
客戶端:
import socket client = socket.socket()#聲明socket類型並生產連接對象 client.connect(('localhost',9999))#發起連接 #循環輸入指令 while True: cmd = input('>>:').strip() if len(cmd) == 0: continue#如果輸入為空則跳過本次循環,重新返回輸入指令 client.send(cmd.encode("utf-8"))#把字符串編譯成比特流發送 cmd_res_size = client.recv(1024)#接收服務器發來的指令內容比特流大小 print("命令結果大小:",cmd_res_size) received_size = 0#接收到的大小為0 received_data = b''#接收到的數據內容為空 #根據接收到的數據大小,循環接受數據使其生成完整的內容再跳出循環 while received_size < int(cmd_res_size.decode()): data = client.recv(1024) received_size += len(data) received_data += data #跳出循環后執行 else: print("cmd res receive done……",received_size) print(received_data.decode()) client.close()
服務器端:
import socket ,os server = socket.socket()#聲明socket類型並生產連接對象 server.bind(('localhost',9999))#綁定ip和port server.listen()#監聽 print('等待連接……') #循環接入 while True: conn,addr = server.accept() print('new conn:',addr) #循壞等待指令 while True: print("等待新指令") data = conn.recv(1024)#接收比特流數據 #沒有接收到比特流數據,則無數據在傳輸即斷開連接 if not data: print("客戶已經斷開") break print("執行指令:",data) cmd_res = os.popen(data.decode()).read()#把比特流數據轉為str,再執行指令,最后讀取到內存賦值給變量cmd_res print("before send:",len(cmd_res)) #判斷cmd_res是否為 0,popen函數執行失敗返回 0 if len(cmd_res) == 0: cmd_res = "cmd has no output..." #cmd_res為字符串,.encode()后變為比特流,再用len計算出比特流的大小,再把這個整數轉為字符串,最后轉為比特流發送出去 conn.send( str(len(cmd_res.encode())).encode("utf-8") ) #把指令執行內容編譯成比特流發送出去 conn.send(cmd_res.encode("utf-8")) print("send done") server.close()
ftp客戶端:
import socket import hashlib client = socket.socket() client.connect(('localhost',9999)) while True: cmd = input(">>: ").strip() if len(cmd) == 0:continue if cmd.startswith("get"): client.send(cmd.encode()) server_response = client.recv(1024) print("server response: ",server_response) client.send(b"ready to recv file") file_total_size = int(server_response.decode()) received_size = 0 filename = cmd.split()[1] f = open(filename + ".new","wb") m = hashlib.md5() while received_size < file_total_size: if file_total_size - received_size > 1024: size = 1024 else: size = file_total_size -received_size print("last received:",size) data = client.recv(size) received_size += len(data) m.update(data) f.write(data) else: new_file_md5 = m.hexdigest() print("file recv done",received_size,file_total_size) f.close() server_file_md5 = client.recv(1024) print("server file md5: ",server_file_md5) print("client file md5: ",new_file_md5) client.close()
ftp服務器端:
import socket,os import hashlib server = socket.socket() server.bind(('0.0.0.0',9999)) server.listen(5) print("等待連接....") while True: conn,addr = server.accept() print("連接成功....") while True: print("等待指令") data = conn.recv(1024) if not data: print("客戶端已斷開") break cmd,filename = data.decode().split() print(filename) if os.path.isfile(filename): f = open(filename,"rb") m = hashlib.md5() file_size = os.stat(filename).st_size conn.send( str(file_size).encode() ) conn.recv(1024)#wait for ack for line in f: m.update(line) conn.send(line) print("file md5",m.hexdigest()) f.close() conn.send(m.hexdigest().encode()) print("文件發送完畢....") server.close()
socketserver模塊
實現簡單的連接:
客戶端:
import socket client = socket.socket() client.connect(('localhost',9999)) while True: cmd = input(">>:").strip() if len(cmd) == 0:continue client.send(cmd.encode('utf-8')) data = client.recv(10240) print("從服務器接受到的數據:",data.decode()) client.close()
服務器端:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): while True: try: self.data = self.request.recv(1024).strip() if not self.data: print("客戶已斷開") break print("{} wrote:".format(self.client_address[0])) print(self.data) self.request.send(self.data.upper()) except ConnectionResetError as e: print("Error:",e) break if __name__ == "__main__": HOST,PORT = "localhost",9999 server = socketserver.TCPServer((HOST,PORT),MyTCPHandler) server.serve_forever()