import客戶端osimport
struct
import
json
import
socket
#設定檔案上傳路徑
base_path = '
'file_list =os.listdir(base_path)
#建立客戶端
client =socket.socket()
#連線服務端
client.connect(('
127.0.0.1
', 8888))
while
true:
#列印檔案列表
for file in
file_list:
(file_list.index(file), file)
#選擇檔案
choice = input('
>>>:
').strip()
#判斷輸入是否正確
ifnot choice.isdigit() or int(choice) < 0 or int(choice) >=len(file_list):
print('
輸入有誤')
continue
choice =int(choice)
#拼接檔案路徑
file_name =file_list[choice]
file_path =os.path.join(base_path, file_name)
#獲取檔案大小
file_size =os.path.getsize(file_path)
#建立字典
json_dic =
#用json將字典序列化
json_dic = json.dumps(json_dic).encode('
utf-8')
#用struct打包
header = struct.pack('i'
, len(json_dic))
#傳送報頭
client.send(header)
#傳送字典
client.send(json_dic)
#傳送檔案
sented =0
print('
開始傳送檔案.....')
with open(file_path, 'rb
') as f:
for line in
f: client.send(line)
sented +=len(line)
#顯示進度
print(f'
\r%',end=''
)
print('
檔案傳送完畢.....
')
import服務端基於tcp協議,實現客戶端與服務端進行檔案上傳操作.struct
import
osimport
json
import
socket
#建立服務端
server =socket.socket()
#繫結ip和埠
server.bind(('
127.0.0.1
', 8888))
#建立半連線池
server.listen(5)
while
true:
#與客戶端建立連線通道,並獲取其ip位址
conn, addr =server.accept()
while
true:
try:
#接收報頭
msg = conn.recv(4)
#解析報頭
header_len = struct.unpack('i'
, msg)[0]
#接收報頭字典
header_dic =conn.recv(header_len)
#反序列化
json_d = json.loads(header_dic.decode('
utf-8'))
#獲取資料長度及檔名
file_size = json_d.get('
file_size')
file_name = json_d.get('
file_name')
#接收資料,將資料寫入檔案
data_count =0
with open(f
'upload/
', 'wb'
) as f:
while data_count
data = conn.recv(1024)
f.write(data)
f.flush()
data_count +=len(data)
print('
上傳成功')
except
connectionreseterror:
break
#資料接收完畢與客戶端斷開連線.
conn.close()
伺服器端與客戶端的操作,一定要一一對應.一方是傳送狀態,另一方必須是讀取狀態
客戶端:
因為tcp是一種流式傳輸,傳資料像流水一樣源源不斷,不會自動分割,所以,得通過先傳遞報頭,把即將要傳送的檔案大小,先告之對方,
這時,考慮到傳送的檔案,可能長度很長,無法用普通方法告知服務端,於引入了字典
將檔案大小,檔名等資訊,以鍵傳對的形式存入字典,再用json將字典序列化,並用encode編譯成二進位制,再獲取其長度,然後再呼叫struct包,將字典的長度進行打包,傳送給服務端,
再傳送二進位制形式的json格式字典
然後,考慮到一次性讀取檔案,可能會導致記憶體溢位的問題,於是,採用讀取一行傳送一行的方式,減輕記憶體壓力
服務端:
因為struct的長度相對固定,要麼4位,要麼8位,這裡用4位接收,
接收到後,再用struct解析
獲取字典長度
接收字典,再用decode解碼,再用json反序列化,再獲取內的資訊,如檔案大小,檔名,等資訊.
然後用檔案儲存接收到的資料,採用接收一行寫入一行的方式,減輕記憶體壓力
TCP網路程式設計
基於tcp 通訊模型 由上圖可以得出tcp通訊的步驟如下 服務端 1 建立乙個socket,用函式socket 2 繫結ip位址 埠等資訊到socket上,用函式bind 3 設定允許的最大連線數,用函式listen 4 等待來著客戶端的連線請求,用函式accept 5 收發資料,用函式send 和...
網路程式設計 TCP
客戶端 1.建立客戶端的socket服務,指定目的主機和埠 2.為了傳送資料,應該獲取socket中的輸出流 3.獲取socket中的輸入流來獲取服務端的反饋資料 4.關閉資源 服務端 1.建立服務端的serversocket服務,並監聽乙個埠 2.通過accept方法 等待並獲取連線過來的客戶端s...
網路程式設計 TCP
即有傳送緩衝區 接收緩衝區,傳送次數和接收次數不一定對等。報頭長,成本高,需要搭載更多的資料。1.三次握手 通過對ack的確認,建立可靠連線。有超時重傳機制 2.四次揮手 有可能伺服器處理資料的時間較短,即三次揮手 3.狀態圖 2 保證遲來的資料報能被識別並丟棄 4.tcp狀態轉移過程 5.tcp報...