1. 程式人生 > >socket實現的簡單的ftp服務(一)

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

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服務(一)