python 使用socket傳輸圖片視頻等文件的實(shí)現(xiàn)方式
在開發(fā)一些需要網(wǎng)絡(luò)通信的應(yīng)用中,經(jīng)常會(huì)用到各種網(wǎng)絡(luò)協(xié)議進(jìn)行通信,博主在開發(fā)實(shí)驗(yàn)室的機(jī)器人的時(shí)候就遇到了需要把機(jī)器人上采集到的圖片傳回服務(wù)器進(jìn)行處理識(shí)別,在python下的實(shí)現(xiàn)方式如下(只貼出了關(guān)鍵代碼)
服務(wù)器端
LOCAL_IP = '192.168.100.22' #本機(jī)在局域網(wǎng)中的地址,或者寫127.0.0.1 PORT = 2567 #指定一個(gè)端口 def server(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # socket.AF_INET 指ipv4 socket.SOCK_STREAM 使用tcp協(xié)議 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #設(shè)置端口 sock.bind((LOCAL_IP, PORT)) #綁定端口 sock.listen(3) #監(jiān)聽端口 while True: sc,sc_name = sock.accept() #當(dāng)有請(qǐng)求到指定端口是 accpte()會(huì)返回一個(gè)新的socket和對(duì)方主機(jī)的(ip,port) print('收到{}請(qǐng)求'.format(sc_name)) infor = sc.recv(1024) #首先接收一段數(shù)據(jù),這段數(shù)據(jù)包含文件的長(zhǎng)度和文件的名字,使用|分隔,具體規(guī)則可以在客戶端自己指定 length,file_name = infor.decode().split('|') if length and file_name: newfile = open('image/'+str(random.randint(1,10000))+'.jpg','wb') #這里可以使用從客戶端解析出來的文件名 print('length {},filename {}'.format(length,file_name)) sc.send(b'ok') #表示收到文件長(zhǎng)度和文件名 file = b'' total = int(length) get = 0 while get < total: #接收文件 data = sc.recv(1024) file += data get = get + len(data) print('應(yīng)該接收{(diào)},實(shí)際接收{(diào)}'.format(length,len(file))) if file: print('acturally length:{}'.format(len(file))) newfile.write(file[:]) newfile.close() sc.send(b'copy') #告訴完整的收到文件了 sc.close()
客戶端
address = ('192.168.100.22', 2567) def send(photos): for photo in photos[0]: print('sending {}'.format(photo)) data = file_deal(photo) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(address) sock.send('{}|{}'.format(len(data), file).encode()) #默認(rèn)編碼 utf-8,發(fā)送文件長(zhǎng)度和文件名 reply = sock.recv(1024) if 'ok' == reply.decode(): #確認(rèn)一下服務(wù)器get到文件長(zhǎng)度和文件名數(shù)據(jù) go = 0 total = len(data) while go < total: #發(fā)送文件 data_to_send = data[go:go + 1024] sock.send(data_to_send) go += len(data_to_send) reply = sock.recv(1024) if 'copy' == reply.decode(): print('{} send successfully'.format(photo)) sock.close() #由于tcp是以流的形式傳輸數(shù)據(jù),我們無法判斷開頭和結(jié)尾,簡(jiǎn)單的方法是沒傳送一個(gè)文件,就使用一個(gè)socket,但是這樣是消耗計(jì)算機(jī)的資源,博主正在探索更好的方法,有機(jī)會(huì)交流一下 def file_deal(file_path): #讀取文件的方法 mes = b'' try: file = open(file_path,'rb') mes = file.read() except: print('error{}'.format(file_path)) else: file.close() return mes
總結(jié)
以上所述是小編給大家介紹的python 使用socket傳輸圖片視頻等文件的實(shí)現(xiàn)方式,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
詳解Python計(jì)算機(jī)視覺 圖像扭曲(仿射扭曲)
這篇文章主要介紹了Python計(jì)算機(jī)視覺 圖像扭曲(仿射扭曲),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03基于Python編寫將文本轉(zhuǎn)換為語音的簡(jiǎn)易應(yīng)用
這篇文章主要介紹了如何使用Python編寫一個(gè)簡(jiǎn)單的應(yīng)用程序,將文本轉(zhuǎn)換為語音,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下2023-08-08Python如何讀取16進(jìn)制byte數(shù)據(jù)
這篇文章主要介紹了Python如何讀取16進(jìn)制byte數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05Python三十行代碼實(shí)現(xiàn)簡(jiǎn)單人臉識(shí)別的示例代碼
這篇文章主要介紹了Python三十行代碼實(shí)現(xiàn)簡(jiǎn)單人臉識(shí)別的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Python文件遍歷os.walk()與os.listdir()使用及說明
這篇文章主要介紹了Python文件遍歷os.walk()與os.listdir()使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11python遍歷迭代器自動(dòng)鏈?zhǔn)教幚頂?shù)據(jù)的實(shí)例代碼
迭代器也是用來遍歷對(duì)象成員的,下面這篇文章主要給大家介紹了關(guān)于python遍歷迭代器自動(dòng)鏈?zhǔn)教幚頂?shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01