Почему серверу требуется так много времени для получения сообщения? Сокет Python

#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. Хорошо, итак, вы подтвердили, что задержка на самом деле связана с передачей изображения, а не с захватом, преобразованием, упаковкой и отправкой изображения в сокет?