傳送端可以不停的傳送新檔案,接收端可以不停的接收新檔案。
例如:傳送端輸入:e:\visio.rar,接收端會預設儲存為 e:\new_visio.rar,支援多併發,具體實現如下;
接收端:
方法一:
#-*- coding: utf-8 -*-
import
socket,time,socketserver,struct,os,thread
host='
192.168.50.74
'port=12307s=socket.socket(socket.af_inet,socket.sock_stream) #
定義socket型別
s.bind((host,port)) #
繫結需要監聽的ip和埠號,tuple格式
s.listen(1)
defconn_thread(connection,address):
while
true:
try:
connection.settimeout(600)
fileinfo_size=struct.calcsize('
128sl')
buf =connection.recv(fileinfo_size)
if buf: #
如果不加這個if,第乙個檔案傳輸完成後會自動走到下一句
filename,filesize =struct.unpack('
128sl
',buf)
filename_f = filename.strip('
\00'
) filenewname = os.path.join('
e:\\
',('
new_
'+filename_f))
'file new name is %s, filesize is %s
' %(filenewname,filesize)
recvd_size = 0 #
定義接收了的檔案大小
file = open(filenewname,'wb'
)
'stat receiving...
'while
not recvd_size ==filesize:
if filesize - recvd_size > 1024:
rdata = connection.recv(1024)
recvd_size +=len(rdata)
else
: rdata = connection.recv(filesize -recvd_size)
recvd_size =filesize
file.write(rdata)
file.close()
'receive done'#
connection.close()
except
socket.timeout:
connection.close()
while
true:
connection,address=s.accept()
print('
connected by
',address)
#thread = threading.thread(target=conn_thread,args=(connection,address)) #使用threading也可以
#thread.start()
thread.start_new_thread(conn_thread,(connection,address))
s.close()
方法二:
#-*- coding: utf-8 -*-
import
socket,time,socketserver,struct,os
host='
192.168.50.74
'port=12307addr=(host,port)
class
myrequesthandler(socketserver.baserequesthandler):
defhandle(self):
print('
connected from:
', self.client_address)
while
true:
fileinfo_size=struct.calcsize('
128sl
') #
定義檔案資訊。128s表示檔名為128bytes長,l表示乙個int或log檔案型別,在此為檔案大小
self.buf =self.request.recv(fileinfo_size)
if self.buf: #
如果不加這個if,第乙個檔案傳輸完成後會自動走到下一句
self.filename,self.filesize =struct.unpack('
128sl
',self.buf) #
根據128sl解包檔案資訊,與client端的打包規則相同
'filesize is:
',self.filesize,'
filename size is:
',len(self.filename) #
檔名長度為128,大於檔名實際長度
self.filenewname = os.path.join('
e:\\
',('
new_
'+ self.filename).strip('
\00')) #
使用strip()刪除打包時附加的多餘空字元
self.filenewname,type(self.filenewname)
recvd_size = 0 #
定義接收了的檔案大小
file = open(self.filenewname,'wb'
)
'stat receiving...
'while
not recvd_size ==self.filesize:
if self.filesize - recvd_size > 1024:
rdata = self.request.recv(1024)
recvd_size +=len(rdata)
else
: rdata = self.request.recv(self.filesize -recvd_size)
recvd_size =self.filesize
file.write(rdata)
file.close()
'receive done'#
self.request.close()
tcpserv =socketserver.threadingtcpserver(addr, myrequesthandler)
print('
waiting for connection...')
tcpserv.serve_forever()
傳送端:
#-*- coding: utf-8 -*-
import
socket,os,struct
s =socket.socket(socket.af_inet,socket.sock_stream)
s.connect((
'192.168.50.74
',12307))
while
true:
filepath = raw_input('
please enter chars:\r\n')
ifos.path.isfile(filepath):
fileinfo_size=struct.calcsize('
128sl
') #
定義打包規則
#定義檔案頭資訊,包含檔名和檔案大小
fhead = struct.pack('
128sl
',os.path.basename(filepath),os.stat(filepath).st_size)
s.send(fhead)
'client filepath:
',filepath
#with open(filepath,'rb') as fo: 這樣傳送檔案有問題,傳送完成後還會發一些東西過去
fo = open(filepath,'rb'
)
while
true:
filedata = fo.read(1024)
ifnot
filedata:
break
s.send(filedata)
fo.close()
'send over...'#
s.close()
python socket 模擬 FTP處理檔案
解析 的思路 首先,先將伺服器和客戶端的建立連線,連線成功後,客戶端要先將自己的請求傳送至server,因為ftp的get是處理檔案的,所以採用cmd.startwith get 作為判斷條件,這個時候必須收到server的應答,server response,表示server已經準備可以接受資料了...
使用Spring OpenFeign 傳輸檔案
完整 1 引入openfeign依賴 a模組 提供方 b 模組 呼叫方 service 層 首先在a模組中寫好了上傳檔案並儲存檔案的介面與實現,其次 b模組在開發中,需要呼叫a模組的介面 a模組介面 使用form data傳輸file檔案 b模組在使用openfeign呼叫a介面時,出現異常 fei...
linux scp linux主機之間傳輸檔案
linux 的 scp 命令 可以 在 linux 之間複製 檔案 和 目錄 scp 命令 scp 可以在 2個 linux 主機間複製檔案 命令基本格式 scp 可選引數 file source file target 從 本地 複製到 遠端 複製檔案 命令格式 scp local file re...