socket實現的簡單的ftp服務(一)


用 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()

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM