Python Socket: Как получать корректные данные при отправке данных раз в 10 мс?

Имеется сервер для 2 клиентов. Первый клиент — localhost, второй — устройство из той же Wi-Fi сети.


Принцип работы серверной части:

  1. После запуска сервер ожидает подключения двух клиентов
  2. После подключения для каждого клиента запускается отдельный поток, в котором каждые X мс отправляется постоянно изменяющийся текст. (В текст каждые 500 мс добавляется 'x')

Клиентская часть:

  • Каждые X мс (интервал как на сервере) клиент принимает данные от сервера порциями по 1024 байта, а затем выводит на экран длину байтового сообщения и сам текст сообщения

Проблема:

Если интервал X мс на получения и отправку данных установить как 500 мс, то данные приходят корректно на оба устройства.

Но если уменьшить это число до 10 мс, то на длина сообщений на стороннем устройстве перестает соответствовать отправленной длине. При этом на клиенте "localhost" все нормально.


Пример работы сервера в течение 10 секунд:

Вывод сервера:

Подключено 1/2
Подключено 2/2
('26.216.111.59', 49371) отправлено 0
('127.0.0.1', 60419) отправлено 0
('127.0.0.1', 60419) отправлено 1
('26.216.111.59', 49371) отправлено 1
('26.216.111.59', 49371) отправлено 1
('127.0.0.1', 60419) отправлено 1

. . . Спустя 10 секунд . . .

('26.216.111.59', 49371) отправлено 49
('127.0.0.1', 60419) отправлено 49
('127.0.0.1', 60419) отправлено 49
('26.216.111.59', 49371) отправлено 49
('26.216.111.59', 49371) отправлено 49
('127.0.0.1', 60419) отправлено 49
('127.0.0.1', 60419) отправлено 49
('26.216.111.59', 49371) отправлено 49
. . .

Вывод клиента localhost (данные идут равномерно):

Принято 1 x
Принято 1 x
Принято 1 x
Принято 1 x
. . .
Принято 2 xx
Принято 2 xx
Принято 2 xx
. . .
Принято 3 xxx
Принято 3 xxx
Принято 3 xxx
Принято 3 xxx
. . .
Принято 49 xxxxxxxxxx
Принято 49 xxxxxxxxxx

. . . и т.д. . . .

Вывод второго клиента (другое устройство), (данные идут неравномерно):

Принято 1 x
Принято 3 xxx
Принято 3 xxx
Принято 3 xxx
Принято 3 xxx
Принято 3 xxx
Принято 3 xxx
Принято 4 xxxx
Принято 3 xxx
Принято 3 xxx
Принято 5 xxxxx
Принято 6 xxxxxx
Принято 8 xxxxxxxx
Принято 8 xxxxxxxx
Принято 6 xxxxxx
Принято 6 xxxxxx
Принято 8 xxxxxxxx
Принято 6 xxxxxx
Принято 6 xxxxxx
Принято 8 xxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 9 xxxxxxxxx
Принято 9 xxxxxxxxx
Принято 9 xxxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 9 xxxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 9 xxxxxxxxx
Принято 11 xxxxxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 12 xxxxxxxxxxxx
Принято 17 xxxxxxxxxxxxxxxxx
Принято 15 xxxxxxxxxxxxxxx
Принято 15 xxxxxxxxxxxxxxx

server.py

from threading import Thread
import socket
import time
import random

text = ''
# функция постоянного изменения текста
def change_text():
    global text
    while True:
        text += 'x'
        time.sleep(0.5)

# отправка данных клиентам
def send_data(client, addr):
    while True:
        data = bytes(text, 'utf-8')
        client.send(data)
        print(f'{addr} отправлено {len(data)}')
        time.sleep(0.01)

# создаем сокет и ждем подключения 2 клиентов
sock = socket.socket()
sock.bind(('', 9090))
sock.listen(2)

clients = []
# добавляем подключенных клиентов в список
for i in range(2):
    clients.append(sock.accept())
    print(f'Подключено {i+1}/2')

# когда оба клиента подключены, запускаем в отдельных потоках отправку данных
for client, addr in clients:
    Thread(target=send_data, args=[client, addr]).start()

# запускаем в отдельном потоке функцию изменения текста, который будет отправляться клиентам
Thread(target=change_text).start()

client.py

import socket
import time

IP = input('Введите IP\n> ')
if len(IP.split()) == 0:
    IP = 'localhost'

sock = socket.socket()
sock.connect((IP, 9090))

while True:
    data = sock.recv(1024)
    text = data.decode('utf-8')
    print('Принято', len(data), text)
    time.sleep(0.01)

Ответы (0 шт):