實驗指南
這篇博客旨在實驗客戶端和服務端相互發送訊息的實驗,實驗成功的現象為,客戶端和服務端的兩個視窗,即client和server左上角均被打上文字,因為客戶端是沒有給圖片附上文字的功能的,十分感謝柒上夏OPO大佬提供原始碼上的支持
客戶端代碼
import numpy as np
import cv2
from socket import socket, AF_INET, SOCK_DGRAM
# 127.0.0.1表示本機的IP,用于測驗,使用時需要改為服務端的ip
addr = ('127.0.0.1', 8081)
IP_ADDR = ('127.0.0.1', 8082)
cap = cv2.VideoCapture(0)
# 設定鏡頭解析度,默認是640x480
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
s = socket(AF_INET, SOCK_DGRAM) # 創建UDP套接字
s.bind(IP_ADDR)
while True:
_, img = cap.read()
img = cv2.flip(img, 1)
# 壓縮圖片
_, send_data = https://www.cnblogs.com/FallMax/p/cv2.imencode('.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 50])
s.sendto(send_data, addr)
print(f'正在發送資料,大小:{img.size} Byte')
# cv2.putText(img, "client", (50, 50),
# cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
# cv2.imshow('client', img)
try:
data, _ = s.recvfrom(921600)
print('info: ', _)
receive_data = https://www.cnblogs.com/FallMax/p/np.frombuffer(data, dtype='uint8')
r_img = cv2.imdecode(receive_data, 1)
cv2.imshow('client', r_img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
except BlockingIOError as e:
pass
if cv2.waitKey(1) & 0xFF == ord('q'):
break
s.close()
cv2.destroyAllWindows()
服務端代碼
from copy import deepcopy
import numpy as np
import cv2
from socket import socket, AF_INET, SOCK_DGRAM
s = socket(AF_INET, SOCK_DGRAM) # 創建UDP套接字
addr = ('0.0.0.0', 8081) # 0.0.0.0表示本機
s.bind(addr)
s.setblocking(0) # 設定為非阻塞模式
while True:
data = https://www.cnblogs.com/FallMax/p/None
try:
data, s_addr = s.recvfrom(921600)
print('[IP_INFO] {}'.format(s_addr))
receive_data = https://www.cnblogs.com/FallMax/p/np.frombuffer(data, dtype='uint8')
r_img = cv2.imdecode(receive_data, 1)
r_img_1 = deepcopy(r_img)
r_img_2 = deepcopy(r_img)
cv2.putText(r_img_1, "server", (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
cv2.imshow('server', r_img_1)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.putText(r_img_2, "client", (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
_, send_data = https://www.cnblogs.com/FallMax/p/cv2.imencode('.jpg', r_img_2, [cv2.IMWRITE_JPEG_QUALITY, 50])
s.sendto(send_data, s_addr)
print(f'正在發送資料,大小:{r_img.size} Byte')
except BlockingIOError as e:
pass
cv2.destroyAllWindows()
實驗歷程
假設服務端代碼放在server.py的檔案中,先打開一個終端
python server.py
假設客戶端代碼放在client.py的檔案中,再打開一個終端,輸入
python client.py
實驗成功的現象
客戶端和服務端的兩個視窗,即client和server左上角分別被打上client和server的字樣,因為客戶端是沒有給圖片附上文字的功能的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/545022.html
標籤:Python
