Python传输图片(同一局域网下版本)
生活随笔
收集整理的這篇文章主要介紹了
Python传输图片(同一局域网下版本)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡述
Python可以通過網絡套接字來進行傳輸圖片
這點還是比較有意思的。
下面用TCP來進行實現,適用于Python3
代碼功能簡述
下面代碼
- 實現了在一個電腦上發送圖片(Sender)
- 實現了在另外一個電腦(也可以是同一個電腦上的不同端口)接受圖片(Reciever)
- 只發一次,然后只收一次
- 新圖片會在舊圖片上多一個 “new_”前綴
- 必須要先開接受者代碼才行,之后再啟動發送者代碼(不然發送者代碼會直接被拒絕)
- 下面是固定了在一個電腦上(看ip地址,下面寫的是127.0.0.1,如果是其他電腦就寫其他電腦上的ip地址)
- 另外本程序只能在同一個局域網下使用(就算是廣域網上,那就必須要使用廣域網的ip地址)
代碼
【后附解析】
Sender.py (發送者)
import socket import os import sys import structdef sock_client():try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect(('127.0.0.1', 6666))except socket.error as msg:print(msg)print(sys.exit(1))while True:filepath = input('input the file: ')# filepath = 'test.png'fhead = struct.pack(b'128sl', bytes(os.path.basename(filepath), encoding='utf-8'), os.stat(filepath).st_size)s.send(fhead)print('client filepath: {0}'.format(filepath))fp = open(filepath, 'rb')while 1:data = fp.read(1024)if not data:print('{0} file send over...'.format(filepath))breaks.send(data)s.close()breakif __name__ == '__main__':sock_client()Reciever.py (接受者)
import socket import os import sys import structdef socket_service():try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)s.bind(('127.0.0.1', 6666))s.listen(10)except socket.error as msg:print(msg)sys.exit(1)print("Wait")while True:sock, addr = s.accept()deal_data(sock, addr)breaks.close()def deal_data(sock, addr):print("Accept connection from {0}".format(addr))while True:fileinfo_size = struct.calcsize('128sl')buf = sock.recv(fileinfo_size)if buf:filename, filesize = struct.unpack('128sl', buf)fn = filename.decode().strip('\x00')new_filename = os.path.join('./', 'new_' + fn)recvd_size = 0fp = open(new_filename, 'wb')while not recvd_size == filesize:if filesize - recvd_size > 1024:data = sock.recv(1024)recvd_size += len(data)else:data = sock.recv(1024)recvd_size = filesizefp.write(data)fp.close()sock.close()breakif __name__ == '__main__':socket_service()解析:
發送者代碼:
還是先創建TCP套接字,并發起連接:
具體代碼如下:
接下來的While循環中,就開始進行圖片發送
- 通過struct庫進行打包,然后再用套接字來發送
注意:網絡上的有些代碼是不能直接用的,比如在這里,就需要把str變成bytes - 通過os庫來獲取文件的基本名(這個是為了避免有些文件中包含具體路徑)
- 通過os庫來獲取文件的大小(通過文件狀態中關于大小的描述中獲取到)
之后再通過二進制方式來獲取文件。
然后再發送出去,每次發送固定長度的數據。先讀,再判斷是否為空,再發送。
接受端:
還是一樣,先創建套接字(不過這個需要綁定對應的ip以及端口)
具體代碼如下:(這里寫的是監聽10個套接字對象,但是在我們代碼中并沒喲用到)
之后就進入到循環,來判斷,是否獲取到sock對象,這里是會進入阻塞狀態的。
在deal_data中就開始通過連接的對象來獲取數據。
一樣,還是一個無限循環,但其實本質上還是空的。。。沒什么特別的。
之后就是對于傳過來的文件名處理一下,這里的這些“128sl”,其實就是一個大小規模(類似于打包的箱子大小的樣子)。然后就是得到新的文件名了。
對應的代碼如下:
之后的recvd_size,其實就是為了來計數的標簽
之后就不斷地收,邊收邊寫入文件,一直到收完了之后。就關閉掉對應的文件流
最后關閉套接字,退出循環
總結
以上是生活随笔為你收集整理的Python传输图片(同一局域网下版本)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: \00在python中
- 下一篇: Python3远程监控程序实现