如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

本文實例為大家分享了python實現udp傳輸圖片的具體代碼,供大家參考,具體內容如下:

首先要了解UDP的工作模式

如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

對於服務器,首先綁定IP和端口,本機測試的時候可以使用127.0.0.1是本機的專有IP,端口號 大於1024的是自定義的,所以用大於1024的端口號,然後接收客戶端數據,處理,返回 對於客戶端,UDP不用建立連接,只管發送不管接收到沒有,所以可以直接對服務器的IP地址和端口號發送信息,然後等待應答。

注意傳輸的數據是二進制流數據,所以要找方法把需要傳輸的數據編碼成二進制碼流,傳過去之後再解碼即可,這裡我用到了opencv讀取圖片成numpy的array格式,然後編碼,傳輸,最後接到之後再解碼。

先說一次性傳輸整個圖片,這個思路就是接受的參數設置很大,而且圖片比較小的情況,實現比較簡單

首先是服務器腳本,實現了接收、顯示、應答

<code>udp_sever.py/<code>


如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

客戶端腳本,實現了發送圖片,接收應答

udp_client.py

如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

為了方便理解放一下圖片轉到二進制再轉回圖片的代碼:

如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

分批傳輸圖片

搞了好久終於知道怎麼分批傳輸圖片了,首先要知道需要傳的圖片需要多長的內存,不然不知道什麼時候停止接收,這樣就要考慮加一個文件頭,告訴服務器要接受多長的碼流。

實現思路是,首先客戶端要先發送一個文件頭,包含了碼流的長度,用一個long int型的數,先用struct.pack打包,發過去,然後循環發送圖片的碼流即可

接著服務器先接到文件頭,確認圖片碼流的長度,然後循環接收確定長度的碼流,最後再解碼成圖片即可

實現代碼如下:

首先是客戶端腳本

udp_client.py

如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

然後是服務器接收

udp_sever.py

如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

-------------------分割線----------------

上面是基本的實現,經過一番學習我終於掌握了UDP傳輸的精髓

首先是確定客戶端和服務器的運行機制

客戶端:先定義一個socket對象,不用綁定,然後指定IP地址和端口發送消息,然後如果用了recvfrom就會一直阻塞等待應答(這個很有用,作用就是保證對方確實收到,再發新的消息,不用在考慮發送頻率的問題了),前面加一個while True就可以循環發送了,如果涉及到很大的消息,可以拆分發送,技巧是先發送一個文件頭高速服務器要發的內容有多大(文件頭這裡建議使用stuct庫,看前面例程),然後隨後發送文件內容,保證要循環發送,因為每次發送,對面就當發了一次,假如發了2048字節的內容,對面設置的每次收1024,那麼剩下的1024就被丟掉了,而不是等待下次繼續接收。還有就是發送的是二進制的碼流。

目前我用到的轉換成碼流的方法有:

圖片用opencv,先imencode 轉成二進制,然後再轉成numpy,然後再tostring。文件頭這種,需要確切知道佔多大內存,使得服務器好接收的,用了stuct庫,裡面的pack,unpack,calcsize三個函數非常好用,發送的時候把數據pack一下就能發送了。列表、字典等等,作為文件內容,用到了json,有點萬能,先json.dumps轉換成json類型,然後再encode編碼成二進制即可拿去發送了。

服務器:先定義一個socket對象,綁定IP地址和端口,讓客戶端可以找到,然後等待接收消息,收到消息之後處理消息,應答,配合客戶端的recvfrom,保證接收頻率一致,服務器為了保證始終接收消息,一定會有一個while True,接收到的消息是二進制碼流,因此要進行解碼。針對上面講的編碼方式解碼,其實就是編碼方式的反向操作:圖片,用opencv解碼,先是np.fromstring,然後再cv2.imdecode(data, cv2.IMREAD_COLOR)。對於接收文件頭,這裡有點技巧,用struct.calcsize確定文件頭長度,然後只接收這個長度的碼流,再unpack出來即可,這裡unpack是個元組。對於json,解碼就是先decode,再json.loads即可,是上面編碼的反向操作。

然後再高端一點的操作,同一個腳本多進程工作,這就要用到了threading.Thread創建多個進程,思路就是新建多個服務器,然後分配給不同的進程,他們的IP地址可以一樣,端口號不一樣就行,然後就可以在同一個腳本里並行工作了,這裡不同於TCP,因為UDP不需要建立連接

然後附上我實現的源碼,服務器腳本里有兩個進程,一個接收客戶端1的圖片,另一個接收客戶端2的列表

服務器

udp_server.py

如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

客戶端1

udp_client_1.py

如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

客戶端2

udp_client_2.py

如何用python實現udp傳輸圖片功能?看完本文代碼教學,輕鬆上手

以上就是本文的全部內容啦,更多相關內容關注小編敬請期待為你帶來更優質的相關文章

結尾

最後多說一句,小編是一名python開發工程師,這裡有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。想要這些資料的可以關注小編,並在後臺私信小編:“07”即可領取。


分享到:


相關文章: