socket實現的簡單的ftp服務(一)
阿新 • • 發佈:2017-10-31
socket 中文 add blog style log 實現簡單 port 數據
用 socket實現簡單的ftp服務
ex:服務端
1 import socket,os 2 server=socket.socket() 3 server.bind(("localhost",6969))#綁定要監聽端口 4 server.listen()#監聽 5 print("等待操作命令") 6 while True:#開始接電話 7 conn, addr = server.accept() # 等電話打進來 8 # conn 就是客戶端連接過來,服務端為其生成的一個連接實例 9 print("命令來了",addr) 10 while True:11 data=conn.recv(1024)#接收,接收的包大小最大是1024個字節(最大8192),改小這個值,將出現未接收完的數據, 12 # 還在緩存區中,下次執行會先發送出來.(改大buff解決不了問題)。方案:先告訴客戶端要發送多少數據,讓客戶端 13 #校驗,完全接收數據 14 if not data:#判斷是否有數據發送進來 15 print("客戶端已斷開") 16 break 17 print("執行命令%s"%data) 18 cmd_res=os.popen(data.decode()).read()19 if len(cmd_res)==0: 20 cmd_res = "命令錯誤" # 命令錯誤時給客戶端發回信息內容 21 conn.send(str(len(cmd_res.encode(‘utf-8‘))).encode(‘utf-8‘))#先發大小,第一個encode是因為 22 # 中文字段占三個字節,需要先轉換碼,才是真正的長度,否則出現長度判斷錯誤 23 client_ack = conn.recv(1024) # 客戶端回饋,避免粘包 24 conn.send(cmd_res.encode(‘utf-8‘))#接收後,發送 25 server.close()
ex:客戶端
1 import socket 2 client=socket.socket()#聲明socket類型,同時生成連接對象 3 client.connect((‘localhost‘,6969)) 4 5 while True: 6 cmd=input(">>:").strip() 7 if len(cmd)==0:#當輸入的消息是空時,不發送,等待輸入非空後再發送 8 continue 9 client.send(cmd.encode("utf-8")) 10 cmd_res_size=client.recv(1024)#接收服務端命令的長度 11 client.send("客戶端準備完畢,請發送新命令".encode(‘utf-8‘))#相應服務端,避免粘包 12 recevied_size=0#定義一個空字節,用於後續循環接收判斷是否接收完,跳出循環 13 recevied_data=b‘‘ 14 while recevied_size<int(cmd_res_size.decode()):#循環收返回的數據 15 data=client.recv(1024) 16 recevied_size+=len(data)#每次收到的數據不是剛剛是1024字節,所有必須判斷 17 recevied_data+=data 18 print(recevied_data.decode()) 19 client.close()
socket實現的簡單的ftp服務(一)