Python Socket傳輸檔案

2022-06-15 07:36:09 字數 4682 閱讀 6196

傳送端可以不停的傳送新檔案,接收端可以不停的接收新檔案。

例如:傳送端輸入: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))

print

'file new name is %s, filesize is %s

' %(filenewname,filesize)

recvd_size = 0 #

定義接收了的檔案大小

file = open(filenewname,'wb'

)

print

'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()

print

'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端的打包規則相同

print

'filesize is:

',self.filesize,'

filename size is:

',len(self.filename) #

檔名長度為128,大於檔名實際長度

self.filenewname = os.path.join('

e:\\

',('

new_

'+ self.filename).strip('

\00')) #

使用strip()刪除打包時附加的多餘空字元

print

self.filenewname,type(self.filenewname)

recvd_size = 0 #

定義接收了的檔案大小

file = open(self.filenewname,'wb'

)

print

'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()

print

'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)

print

'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()

print

'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...