使用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...