Python 網路程式設計 檔案傳輸優化版本

2022-05-17 03:53:17 字數 4198 閱讀 4687

一、服務端**為:

1

import

socket

2import

subprocess

3import

struct

4import

json

5importos6

7 share_dir = r'

c:\users\xu516\pycharmprojects\python全棧開發\第三模組\網路程式設計\06_檔案傳輸\優化版本_寫函式\server\share'8

910defget(conn, cmds):

11 filename = cmds[1]12#

3、以讀的方式開啟檔案,讀取檔案內容傳送到客戶端

1314

#第一步:製作固定長度的報頭

15 header_dic =

2021 header_json =json.dumps(header_dic)

22 header_bytes = header_json.encode('

utf-8')

2324

#第二步:先傳送報頭的長度

25 conn.send(struct.pack('i'

, len(header_bytes)))

2627

#第三步:把包頭傳送給客戶端

28conn.send(header_bytes)

2930

#第三步:再傳送真實的資料

31 with open(r'

%s\%s

' % (share_dir, filename), 'rb'

) as f:32#

conn.send(f.read())

33for line in

f:34

conn.send(line)

3536

37def

run():

38 phone =socket.socket(socket.af_inet, socket.sock_stream)39#

phone.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)

40 phone.bind(('

127.0.0.1

', 8081)) #

0-65535:0-1024給作業系統使用

41 phone.listen(5)

4243

print('

starting......')

44while true: #

鏈結迴圈

45 conn, client_addr =phone.accept()

46print

(client_addr)

4748

while true: #

通訊迴圈

49try:50

#1、收命令

51 res = conn.recv(8096) #

b'get a.txt'

52if

not res: #

適用於linux作業系統

53break

5455

#2、解析命令,提取相應命令引數

56 cmds = res.decode('

utf-8

').split() #

['get', 'a.txt']

57if cmds[0] == '

get':58

get(conn, cmds)

5960

except connectionreseterror: #

適用於windows作業系統

61break

6263

conn.close()

6465

phone.close()

6667

68if

__name__ == '

__main__':

69 run()

二、客戶端**為:

1

import

socket

2import

struct

3import

json

45 download_dir = r'

c:\users\xu516\pycharmprojects\python全棧開發\第三模組\網路程式設計\06_檔案傳輸\優化版本_寫函式\client\download'6

78defget(phone, cmds):9#

2、以寫的方式開啟乙個新檔案,接收伺服器端發來的檔案內容寫入客戶的新檔案

1011

#第一步:先收報頭的長度

12 obj = phone.recv(4)

13 header_size = struct.unpack('i'

, obj)[0]

1415

#第二步:再收報頭

16 header_bytes =phone.recv(header_size)

1718

#第三步:從報頭中解析出對真實資料的描述資訊

19 header_json = header_bytes.decode('

utf-8')

20 header_dic =json.loads(header_json)

21print

(header_dic)

22 total_size = header_dic['

file_size']

23 filename = header_dic['

filename']

2425

#第四步: 接收真實的資料

26 with open('

%s\%s

' % (download_dir, filename), 'wb'

) as f:

27 recv_size =0

28while recv_size

29 line = phone.recv(1024)

30f.write(line)

31 recv_size +=len(line)

32print('

' %(total_size, recv_size))

3334

35def

put(phone, cmds):

36pass

3738

39def

run():

40 phone =socket.socket(socket.af_inet, socket.sock_stream)

41 phone.connect(('

127.0.0.1

', 8081))

4243

while

true:44#

1、發命令

客戶端執行結果為:

1 >>:get test.py

2 4 >>:

VC 網路程式設計 檔案傳輸

在socket程式設計中,以前學習的時候都是簡單的字元傳輸,而在實際的應用中,經常需要傳輸檔案,其實網路上的檔案傳輸都是先把資料轉化為位元組流,當然,最底層的是01二進位制資料的傳輸,但是這部在我們討論範圍之內,其實現在還只是研究小檔案怎麼傳輸,當檔案很大時,需要用到斷點續傳。好了,要傳輸檔案,首先...

VC 網路程式設計 檔案傳輸

在socket程式設計中,以前學習的時候都是簡單的字元傳輸,而在實際的應用中,經常需要傳輸檔案,其實網路上的檔案傳輸都是先把資料轉化為位元組流,當然,最底層的是01二進位制資料的傳輸,但是這部在我們討論範圍之內,其實現在還只是研究小檔案怎麼傳輸,當檔案很大時,需要用到斷點續傳。好了,要傳輸檔案,首先...

Python檔案傳輸

encode是編碼 例如 name.encode gb2312 表示將字串name以gb2312編碼。decode是解碼 例如 name.decode gb2312 表示將字串name以gb2312解碼。按行讀取txt裡的檔名,把檔案移到指定的路徑裡。coding utf 8 import thre...