亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python使用socket高效傳輸視頻數(shù)據(jù)幀(連續(xù)發(fā)送圖片)

 更新時(shí)間:2021年10月22日 16:42:54   作者:dxwell6  
本文主要介紹了python使用socket高效傳輸視頻數(shù)據(jù)幀(連續(xù)發(fā)送圖片),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

遇到的問(wèn)題

網(wǎng)上找了一些代碼,都是只能建立一次socket傳輸一張圖片,然后斷開(kāi)重新連重新傳。而建立一次socket代價(jià)不小,反復(fù)建立會(huì)非常消耗系統(tǒng)資源,因此嘗試自己通過(guò)一次socket連續(xù)傳輸多張圖片

代碼問(wèn)題記錄(需要代碼的可以直接文末)

在做的過(guò)程中發(fā)現(xiàn)了一些問(wèn)題:

socket在傳一張圖片時(shí)是以二進(jìn)制流的形式傳輸,圖片的二進(jìn)制流比較大,一般一次傳不完,要傳很多次。那么接受者是如何知道什么時(shí)候才停止接收這張圖片呢?那可以讓發(fā)送者在發(fā)圖之前先發(fā)一個(gè)頭信息,告訴接收者這個(gè)二進(jìn)制流有多長(zhǎng),然后接收者通過(guò)這個(gè)來(lái)判斷是否傳完。

這個(gè)問(wèn)題是最讓我致命的,由于發(fā)送者先發(fā)了一個(gè)頭信息,使用socket.send()函數(shù),然后發(fā)送圖片也是要用socket.send()函數(shù),接收端使用的是socket.recv(1024)函數(shù),1024是緩存大。麻煩來(lái)了,由于發(fā)送者使用連續(xù)的兩個(gè)send,而socket.recv(1024)是有緩存的,他會(huì)把這兩個(gè)信息緩存到一起去,信息頭和圖片信息全被緩存了!??!這會(huì)直接導(dǎo)致代碼接收邏輯錯(cuò)誤。我的做法是,不能有兩個(gè)send同時(shí)出現(xiàn),那么我就在send中間加一個(gè)recv函數(shù)(阻塞函數(shù)),也就是發(fā)送者每發(fā)一個(gè)消息,接收者就立馬回復(fù)一個(gè)消息,這樣就保證了不會(huì)連續(xù)send

在這里插入圖片描述 

代碼

由于項(xiàng)目存在兩種數(shù)據(jù)源,一種是可見(jiàn)光,一種是紅外,所以我最開(kāi)始還要制作一個(gè)信息頭,每次發(fā)送的時(shí)候要告訴接收者這是什么類型的數(shù)據(jù),然后再接收

制作不易,記得給個(gè)贊哈!

客戶端clien.py

# 服務(wù)器的地址
server_address = ('127.0.0.1', 8000)


def send(dir_name, data_format, file_name):
    # 與接收端建立socket通信
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # AF_INET(TCP/IP – IPv4)協(xié)議
    sock.connect(server_address)

    # 每次通信都帶一個(gè)通信頭,表明數(shù)據(jù)源的類型(紅外還是可見(jiàn)光),要保存數(shù)據(jù)幀的文件夾名file_name
    # 你可以不要數(shù)據(jù)格式,這里可以定義成你自己的形式,也算是一種安全機(jī)制
    sock.send('{}|{}'.format(data_format, file_name).encode())  # 默認(rèn)編碼 utf-8,發(fā)送文件長(zhǎng)度和文件名
    reply = sock.recv(1024)

    # 按照文件名排序,0.png,1.png
    file_list = os.listdir(dir_name)
    file_list.sort(key=lambda x: int(x[:-4]))
    if 'ok' == reply.decode():  # 確認(rèn)一下服務(wù)器get到文件長(zhǎng)度和文件名數(shù)據(jù)
        i = 0
        print(len(file_list))
        for file_name in file_list:
            data = file_deal(os.path.join(dir_name, file_name))
            sock.send('{}|{}'.format(len(data), file_name).encode())
            sock.recv(1024)
            go = 0
            total = len(data)
            while go < total:  # 發(fā)送文件
                data_to_send = data[go:go + total//2]
                sock.send(data_to_send)
                go += len(data_to_send)
            sock.recv(1024).decode()
            i += 1
            if i < len(file_list):
                sock.send(b'continue')
        sock.send(b'over')
        sock.close()
        sys.exit(0)


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

服務(wù)端server.py

LOCAL_IP = '127.0.0.1'  # 本機(jī)測(cè)試使用ip,局域網(wǎng)中使用需更換ip
PORT = 8000  # 隨意指定一個(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)聽(tīng)端口
    while True:
        sc, sc_name = sock.accept()  # 當(dāng)有請(qǐng)求到指定端口是 accept()會(huì)返回一個(gè)新的socket和對(duì)方主機(jī)的(ip,port)
        print('收到{}機(jī)器請(qǐng)求'.format(sc_name))
        info = sc.recv(1024)  # 接受客戶端發(fā)來(lái)的協(xié)議頭,區(qū)分?jǐn)?shù)據(jù)源
        # 安全處理:如果不是以這個(gè)協(xié)議頭開(kāi)始,認(rèn)為是非法接入,就直接斷掉。這里可以自己定義一些安全消息機(jī)制
        print(info)
        try:
            data_format, directory_name = info.decode().split("|")
            sc.send(b'ok')  # 表示收到文件長(zhǎng)度和文件名
        except:
            print('協(xié)議頭不對(duì),自動(dòng)斷開(kāi)連接')
            sc.close()
            continue

        if not os.path.exists(directory_name):
            os.mkdir(directory_name)
        # 協(xié)議頭正確之后,不斷接收發(fā)來(lái)的數(shù)據(jù)幀
        while True:
            head_info = sc.recv(1024)
            # print(data_info)
            length, file_name = head_info.decode().split('|')
            sc.send(b'ok')
            if length and file_name:
                print(file_name)
                newfile = open(os.path.join(directory_name, file_name), 'wb')  # 這里可以使用從客戶端解析出來(lái)的文件名
                file = b''
                total = int(length)
                get = 0
                while get < total:  # 接收文件
                    data = sc.recv(total//2)
                    file += data
                    get = get + len(data)
                sc.send(b'ok')
                print('應(yīng)該接收{(diào)},實(shí)際接收{(diào)}'.format(length, len(file)))
                if file:
                    print('actually length:{}'.format(len(file)))
                    newfile.write(file[:])
                    newfile.close()
            reply = sc.recv(1024)
            if reply.decode() == "over":
                break

server()

啟動(dòng)步驟

1.先啟動(dòng)server.py
2.再啟動(dòng)client.py

參考文章

https://blog.csdn.net/hfutzhouyonghang/article/details/86624684

到此這篇關(guān)于python使用socket高效傳輸視頻數(shù)據(jù)幀(連續(xù)發(fā)送圖片)的文章就介紹到這了,更多相關(guān)python socket傳輸視頻數(shù)據(jù)幀內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn)給圖片添加文字或圖片水印

    Python實(shí)現(xiàn)給圖片添加文字或圖片水印

    在現(xiàn)今的數(shù)字化時(shí)代,網(wǎng)絡(luò)上的圖片泛濫,盜圖現(xiàn)象也越來(lái)越嚴(yán)重。因此,在發(fā)布文章時(shí),為了保護(hù)自己的原創(chuàng)作品版權(quán),很多人選擇使用水印來(lái)保護(hù)他們的圖片。本文就和大家分享了Python實(shí)現(xiàn)給圖片添加文字或圖片水印的方法,需要的可以收藏一下
    2023-05-05
  • Python股票數(shù)據(jù)可視化代碼詳解

    Python股票數(shù)據(jù)可視化代碼詳解

    這篇文章主要為大家詳細(xì)介紹了Python股票數(shù)據(jù)可視化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • python爬蟲(chóng)判斷招聘信息是否存在的實(shí)例代碼

    python爬蟲(chóng)判斷招聘信息是否存在的實(shí)例代碼

    在本篇文章里小編給大家整理的是一篇關(guān)于python爬蟲(chóng)判斷招聘信息是否存在的實(shí)例代碼,有興趣的朋友們可以學(xué)習(xí)下。
    2020-11-11
  • python 3.74 運(yùn)行import numpy as np 報(bào)錯(cuò)lib\site-packages\numpy\__init__.py

    python 3.74 運(yùn)行import numpy as np 報(bào)錯(cuò)lib\site-packages\numpy\_

    這篇文章主要介紹了python 3.74 運(yùn)行import numpy as np 報(bào)錯(cuò)lib\site-packages\numpy\__init__.py,原來(lái)需要更新一下numpy即可
    2019-10-10
  • pytorch finetuning 自己的圖片進(jìn)行訓(xùn)練操作

    pytorch finetuning 自己的圖片進(jìn)行訓(xùn)練操作

    這篇文章主要介紹了pytorch finetuning 自己的圖片進(jìn)行訓(xùn)練操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Python反爬蟲(chóng)技術(shù)之防止IP地址被封殺的講解

    Python反爬蟲(chóng)技術(shù)之防止IP地址被封殺的講解

    今天小編就為大家分享一篇關(guān)于Python反爬蟲(chóng)技術(shù)之防止IP地址被封殺的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Python tkinter模版代碼實(shí)例

    Python tkinter模版代碼實(shí)例

    這篇文章主要介紹了Python tkinter模版代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 在langchain中對(duì)大模型的輸出進(jìn)行格式化實(shí)現(xiàn)

    在langchain中對(duì)大模型的輸出進(jìn)行格式化實(shí)現(xiàn)

    這篇文章主要為大家介紹了在langchain中對(duì)大模型的輸出進(jìn)行格式化實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Python Selenium 設(shè)置元素等待的三種方式

    Python Selenium 設(shè)置元素等待的三種方式

    這篇文章主要介紹了Python Selenium 設(shè)置元素等待的三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python入門教程(十二)Python列表

    Python入門教程(十二)Python列表

    這篇文章主要介紹了Python入門教程(十二)Python列表,Python是一門非常強(qiáng)大好用的語(yǔ)言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下
    2023-04-04

最新評(píng)論