人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

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

發(fā)布日期:2021-12-21 02:17 | 文章來源:源碼中國

遇到的問題

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

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

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

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

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

代碼

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

制作不易,記得給個贊哈!

客戶端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)
 # 每次通信都帶一個通信頭,表明數(shù)據(jù)源的類型(紅外還是可見光),要保存數(shù)據(jù)幀的文件夾名file_name
 # 你可以不要數(shù)據(jù)格式,這里可以定義成你自己的形式,也算是一種安全機制
 sock.send('{}|{}'.format(data_format, file_name).encode())  # 默認編碼 utf-8,發(fā)送文件長度和文件名
 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():  # 確認一下服務(wù)器get到文件長度和文件名數(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'  # 本機測試使用ip,局域網(wǎng)中使用需更換ip
PORT = 8000  # 隨意指定一個端口
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)有請求到指定端口是 accept()會返回一個新的socket和對方主機的(ip,port)
  print('收到{}機器請求'.format(sc_name))
  info = sc.recv(1024)  # 接受客戶端發(fā)來的協(xié)議頭,區(qū)分數(shù)據(jù)源
  # 安全處理:如果不是以這個協(xié)議頭開始,認為是非法接入,就直接斷掉。這里可以自己定義一些安全消息機制
  print(info)
  try:
data_format, directory_name = info.decode().split("|")
sc.send(b'ok')  # 表示收到文件長度和文件名
  except:
print('協(xié)議頭不對,自動斷開連接')
sc.close()
continue
  if not os.path.exists(directory_name):
os.mkdir(directory_name)
  # 協(xié)議頭正確之后,不斷接收發(fā)來的數(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')  # 這里可以使用從客戶端解析出來的文件名
 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)},實際接收{(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()

啟動步驟

1.先啟動server.py
2.再啟動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)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部