python3 網路檔案傳輸

2021-10-02 09:23:04 字數 3445 閱讀 8448

使用socket與伺服器建立tcp連線

使用open函式以二進位制模式讀取檔案,並分割成指定大小的資料報傳送

規定在傳輸的開始先傳送檔名,傳輸的結尾傳送停止代號

傳送端:

sender.py:

flag=

'$end$'

defsendfile_tcp

(filepath,addr,buf=

1024*64

):import socket

import os

sk = socket.socket(

)#初始化套接字

sk.connect(addr)

#嘗試連線目標主機,如果失敗會引發異常,這裡為了簡便沒有進行異常處理

sum=

0 sp=

'\\'

if sp not

in filepath:

sp='/' filename = filepath.split(sp)[-

1]#分割路徑字串,獲取檔名

sk.send(filename.encode(

'utf-8'))

with

open

(filepath,

'rb'

)as f:

while

true

: os.system(

'title 正在傳送檔案:{} 已傳送 {} kb'

.format

(filename,

int(

sum/

1024))

) data=f.read(buf)

ifnot data:

break

sk.send(data)

sum+=

len(data)

sk.send(flag.encode())

os.system(

'title filesender'

)

sk.close(

)#關閉套接字

if __name__ ==

"__main__"

:import os

addr =

('127.0.0.1'

,20020

)while

true

:print

('【拖拽檔案到此處】'

) path=

input()

sendfile_tcp(path,addr)

讀取路徑之後,通過路徑分隔符\(windows系統)或/(linux系統)對路徑字串filepath呼叫split函式分割並使用返回列表的最後乙個(即檔名)

也可以用現成的函式os.path.basename(path)來返回乙個路徑字串path中的檔名,這是完全等價的

f.read函式讀取指定位元組數的資料,如果讀到了檔案尾部就會返回空資料b''

因此使用if not data來判斷是否讀完了檔案

socket傳送和接收的都是二進位制資料,如果是字串應該先encode,如果是常量字串在引號前加乙個記號b,如此處的結束標誌flag = b'$end$',這裡檔名用utf-8編碼是考慮到檔名可能是中文

通過os.system呼叫命令列顯示當前傳送了多少資料,這裡的時間花銷比較大,如果追求最大速度可以去掉。

接收端:

recv.py

flag=b'$end$'

defrecvfile_tcp

(addr,buf=

1024):

import socket

import os

sk=socket.socket(

) sk.bind(addr)

#繫結套接字到本機的網路位址

sk.listen(10)

#10表示最大連線數

while

true

: client,cli_addr = sk.accept(

)#接受連線請求

filename = client.recv(buf)

.decode(

'utf-8'

)print

('正在接受來自 [{}] 的檔案[{}]'

.format

(cli_addr,filename)

) i =

0while os.path.exists(filename)

: filename=

'{}-{}'

.format

(i,filename)

i +=

1with

open

(filename ,

'ab'

)as f:

while

true

: data=client.recv(buf)

if data == flag:

break

f.write(data)

print

('已成功接收檔案{} | 檔案大小 : {} kb'

.format

(filename,

int(os.path.getsize(filename)

/1024))

) client.close(

)if __name__ ==

"__main__"

: addr=

('127.0.0.1'

,20020

)#本機的ip位址和埠號

recvfile_tcp(addr)

如果伺服器設定了dmz主機,(需要在外網訪問)ip位址應該寫區域網內的ipv4位址,例如192.168.1.100

windows下使用命令ipconfig

linux下使用命令ifconfig -a(基於net-tools,如果沒裝先apt install net-tools)

即可檢視本機區域網ip

Python3網路程式設計

python提供了2個級別的訪問翁羅服務 低階別的網路服務支援socket,他提供了標準的bsd sockets api,可以訪問底層作業系統socket介面的全部方法 高階別的網路服務模組socket server,他提供了伺服器中心類,可以簡化伺服器的開發 使用此函式建立套接字,語法 socke...

python3網路程式設計

網路程式設計 通過網路程式設計解決計算機與計算機間的通訊的通訊協議 網路根據地域面積分為三類 區域網,都會網路,廣域網 ip位址由4個8位組成,每位最大不大於255 b類 128.0.0.0 191.255.255.255 c類 192.0.0.0 233.255.255.255 d,e類 多用於組...

python3 網路程式設計

建立服務端 coding utf 8 import socket net socket socket.socket socket.af inet,socket.sock stream net socket.bind 7788 net socket.listen 10 new socket,clien...