#python #python-sockets
#python #python-сокеты
Вопрос:
Я пытаюсь закодировать простой скрипт общего доступа к экрану. По какой-то причине серверу требуется много времени, чтобы получить сообщение. И я не знаю, в чем проблема. Если у вас есть решение или способ ускорить процесс, это будет очень полезно. В любом случае я ценю вашу помощь.
сервер:
import socket
import pickle
import select
import numpy
import cv2
def receive_msg(socket, HEADERSIZE):#receive message
try:
readySockets, _, _ = select.select([socket], [], [], 0.02)
if readySockets:
msgLen = socket.recv(HEADERSIZE)#receive the header/the message length
msgLen = int(msgLen)#convert fron bytes to int
msg = socket.recv(msgLen)#resive the size of the message
while len(msg) < msgLen:#if dont receive the full message / if the size of the message smaller than the size that the message sepose to be
msg = socket.recv(msgLen - len(msg))#add to the message the part that missing (the full size of the message - the size of the message that the program received)
msg = pickle.loads(msg)#extract message
else:
msg = False
except:
msg = False
return msg#return the complite massage
HEADERSIZE = 10
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1243))
s.listen(5)
clientsocket, address = s.accept()
while True:
# now our endpoint knows about the OTHER endpoint.
msg = receive_msg(clientsocket, HEADERSIZE)
if msg is not False:
image = cv2.cvtColor(msg, cv2.COLOR_RGB2BGR)#numpy array to open cv image
cv2.imshow("image", image)#show image
cv2.waitKey(1)
клиент:
import socket
import numpy as np
import pyautogui
import pickle
def get_screen():
img = pyautogui.screenshot()# take a screenshot
img = np.array(img)#from image to array
return img
def send_msg(socket, msg, HEADERSIZE):#send a message
msg = pickle.dumps(msg)#comprass the msg
#give the mag a header / signature of the size of the message
msg = bytes(str(len(msg)) (" " * (HEADERSIZE - len(str(len(msg))))), 'utf-8') msg
socket.send(msg)#send the msg
HEADERSIZ = 10
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1243))
while True:
send_msg(s, get_screen(), HEADERSIZ)#send a image of the screen to the server
Комментарии:
1. Сколько времени это занимает? Насколько велик ваш экран? Какая пропускная способность существует от клиента к серверу?
2. Задержка составляет 5,4 секунды. Экран HD. И каждое сообщение составляет 6220964 байта.
3. Это задержка (время между отправкой / recv) или delay (время между несколькими отправками)?
4. сколько времени проходит между несколькими отправками
5. Хорошо, итак, вы подтвердили, что задержка на самом деле связана с передачей изображения, а не с захватом, преобразованием, упаковкой и отправкой изображения в сокет?