網路程式設計TCP

2022-03-02 20:26:36 字數 3107 閱讀 9834

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:

print

(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

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協議,實現客戶端與服務端進行檔案上傳操作.

伺服器端與客戶端的操作,一定要一一對應.一方是傳送狀態,另一方必須是讀取狀態

客戶端:

因為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報...