Передача и прием длинного списка клиент-сервер
Есть очень длинный список. Как гарантированно его отправить на сервер и получить обратно? Нарезку данных уже попробовал) У клиента при переменной var = 8000 обратно список возвращается не целиком...
Код сервера:
import socketserver
class ThredingTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
class EchoTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
def recvall(request):
BUFF_SIZE = 4096 # 4 KiB
data = b''
while True:
part = request.recv(BUFF_SIZE)
data += part
if len(part) < BUFF_SIZE:
break
return data
full_data = recvall(self.request)
print(f'Adress: {self.client_address[0]}')
print(f'Data: {len(full_data)} {full_data}')
# некая операция
#d = eval(full_data)
#d = d[::-1]
msg = str(full_data).encode()
self.request.sendall(msg)
if __name__ == '__main__':
with ThredingTCPServer(('', 8888), EchoTCPHandler) as server:
server.serve_forever()
код клиента:
import socket
def recvall(sock):
BUFF_SIZE = 4096 # 4 KiB
data = b''
while True:
part = sock.recv(BUFF_SIZE)
data += part
if len(part) < BUFF_SIZE:
break
return data
var = 8000
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('127.0.0.1', 8888))
msg = str([i*i for i in range(var)]).encode()
sock.send(msg)
res = recvall(sock)
ans = res.decode()
print(len(ans), ans)
sock.close()
Ответы (2 шт):
Автор решения: Konstantin
→ Ссылка
В данном случае мне помогло уменьшение BUFF_SIZE до 256. При таком значении передаваемый список (если как строка) увеличился с 65495 до 1050000, что намного лучше, по сравнению с первоначальным вариантом.
Автор решения: eri
→ Ссылка
Ваша проблема в
if len(part) < BUFF_SIZE:
break
Замените на
if not part:
break