Форум сайта python.su
Добрый день. Помогите пожалуйста разобраться.
Я передаю на сервер от клиента JSON файл.
Порядок действий на клиенте.
Клиент->Создаём_Данные->Словарь->JSON->ConvertToBinary->Send_data_to_server->Ждём_ответа_от_сервера
Сервер успешно его принимает, я редактирую этот файл и потом мне нужно обратно переслать его клиенту. Когда я добавляю в клиенте строку для приёма данных от сервера приложение зависает и ждёт.
#———Код сервера:
#!/usr/bin/env python3
import socket
import json
HOST = ‘127.0.0.1’
PORT = 49111
print("“)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.bind((HOST, PORT))
sock.listen(1)
# Loop for internal connections;
while True:
conn, addr = sock.accept()
with conn:
print(”Connected by address: ", addr)
full_data = b''
while True:
data = conn.recv(1024)
if not data: break
full_data += data
# Convert input bytes to JSON object;
data = json.loads(full_data.decode('utf-8'))
# Check input JSON file;
if data == ‘–get-settings’:
print('IF')
else:
print(“ELSE”)
# Send data to client;
raw_data = json.dumps(data).encode('utf-8')
print(f'Size of message: {len(raw_data)} bytes.')
conn.send(raw_data)
print(“Transmit data finished!”)
#———Код клиента:
#!/usr/bin/env python3
import socket
import json
HOST = ‘localhost’
PORT = 49111
_data = {'data':{'ipaddress': ‘null’, ‘command’: ‘null’}}
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((HOST, PORT))
# Send data to server;
raw_data = json.dumps(_data).encode('utf-8')
sock.send(raw_data)
data = sock.recv(1024) # ЕСЛИ ЭТУ СТРОКУ ЗАККОМЕНТИРОВАТЬ ВСЕ РАБОТАЕТ, НО МНЕ НУЖНО ПОЛУЧИТЬ ДАННЫЕ ОТ СЕРВЕРА
print(data)
Офлайн
Спасибо всем тем кто помог.
Проблема оказалась в том что сервер ожидает 1024 байт на входе, и не выходит из бесконечного цикла. Мои данные были не равны данному числу. Вопрос решился путём добавления в конец JSON файла маркера конца строки. В цикле данные декодируются в обычную строку и ищется маркер. Если найден маркер то вызываем break и выходим из цикла.
Может кому то поможет решение:
# Server side;
full_data = b''
while True:
data = client_sock.recv(1024)
if not data:
break
full_data += data
# Check for end of data transmit;
if ‘end’ in data.decode('utf-8'):
full_data = full_data.decode('utf-8').replace('end', ‘')
break;
# Client side;
Send data to server;
raw_data = json.dumps(_data).encode(’utf-8')
client_sock.send(raw_data)
# Send end of data sign;
client_sock.send(b'end')
Офлайн
ffolaxДа ты свой код перечитай. Отправляешь код неправильно на форум.
Спасибо всем тем кто помог.
# Check input JSON file;
if data == ‘–get-settings’:
print('IF')
else:
print(“ELSE”)
Офлайн