Python基于stuck實(shí)現(xiàn)scoket文件傳輸
使用socket中的struck來(lái)實(shí)現(xiàn)客戶端發(fā)送
服務(wù)端:
客戶端:
# -*- coding: UTF-8 -*-
import socket, time, socketserver, struct, os, _thread
host = '127.0.0.1'
port = 12307
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 定義socket類(lèi)型
s.bind((host, port)) # 綁定需要監(jiān)聽(tīng)的Ip和端口號(hào),tuple格式
s.listen(1)
def conn_thread(connection, address):
while True:
try:
connection.settimeout(600)
fileinfo_size = struct.calcsize('12sl')#12s表示12個(gè)字符,l表示一個(gè)長(zhǎng)整型數(shù)
buf = connection.recv(fileinfo_size)
if buf: # 如果不加這個(gè)if,第一個(gè)文件傳輸完成后會(huì)自動(dòng)走到下一句,需要拿到文件大小信息才可以繼續(xù)執(zhí)行
filename, filesize = struct.unpack('12sl', buf)
filename_f = filename.decode("utf-8").strip('\00') # C語(yǔ)言中'\0'是一個(gè)ASCII碼為0的字符,在python中表示占一個(gè)位置得空字符
filenewname = os.path.join('e:\\', os.path.basename(filename_f))
print(u'文件名稱:%s , 文件大小: %s' % (filenewname, filesize))
recvd_size = 0 # 定義接收了的文件大小
file = open(filenewname, 'wb')
print(u"開(kāi)始傳輸文件內(nèi)容")
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:
print(u"開(kāi)始進(jìn)入監(jiān)聽(tīng)狀態(tài)")
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()
服務(wù)端效果:
# -*- coding: UTF-8 -*-
import socket, os, struct
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 12307))
while True:
filepath = input('請(qǐng)輸入要傳輸?shù)奈募^對(duì)路徑:\r\n')
print(type(filepath))
print(len(filepath.encode("utf-8")))
if os.path.isfile(filepath):
#fileinfo_size = struct.calcsize('20sl') # 定義打包規(guī)則
# 定義文件頭信息,包含文件名和文件大小
fhead = struct.pack('12sl', filepath.encode("utf-8"), os.stat(filepath).st_size)
print(os.stat(filepath).st_size)
s.send(fhead)
print (u'文件路徑: ', filepath)
# with open(filepath,'rb') as fo: 這樣發(fā)送文件有問(wèn)題,發(fā)送完成后還會(huì)發(fā)一些東西過(guò)去
fo = open(filepath, 'rb')
while True:
filedata = fo.read(1024)
if not filedata:
break
s.send(filedata)
fo.close()
print (u'傳輸成功')
# s.close()

客戶端效果

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python Json數(shù)據(jù)文件操作原理解析
這篇文章主要介紹了Python Json數(shù)據(jù)文件操作原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
pytorch1.60 torch.nn在pycharm中無(wú)法自動(dòng)智能提示的解決
這篇文章主要介紹了pytorch1.60 torch.nn在pycharm中無(wú)法自動(dòng)智能提示的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
Python文件操作JSON CSV TSV Excel和Pickle文件序列化
這篇文章主要為大家介紹了Python文件操作之JSON、CSV、TSV、Excel和Pickle文件序列化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Django中modelform組件實(shí)例用法總結(jié)
在本篇文章里小編給大家整理的是關(guān)于Django中modelform組件實(shí)例用法內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)下。2020-02-02
python腳本實(shí)現(xiàn)統(tǒng)計(jì)日志文件中的ip訪問(wèn)次數(shù)代碼分享
這篇文章主要介紹了python腳本實(shí)現(xiàn)統(tǒng)計(jì)日志文件中的ip訪問(wèn)次數(shù)代碼分享,注意此腳本只適用ip在每行開(kāi)頭的日志文件,需要的朋友可以參考下2014-08-08
python matplotlib實(shí)現(xiàn)雙Y軸的實(shí)例
今天小編就為大家分享一篇python matplotlib實(shí)現(xiàn)雙Y軸的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
Pandas將列表(List)轉(zhuǎn)換為數(shù)據(jù)框(Dataframe)
這篇文章主要介紹了Pandas將列表(List)轉(zhuǎn)換為數(shù)據(jù)框(Dataframe),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python遠(yuǎn)程控制Windows服務(wù)器的方法詳解
在很多企業(yè)會(huì)使用閑置的 Windows 機(jī)器作為臨時(shí)服務(wù)器,有時(shí)候我們想遠(yuǎn)程調(diào)用里面的程序或查看日志文件。本文分享了利用Python遠(yuǎn)程控制Windows服務(wù)器的方法,感興趣的可以學(xué)習(xí)一下2022-05-05

