Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 17, 2019 21:21:52

ffolax
Зарегистрирован: 2019-09-17
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

python socket передача файлов

Добрый день. Помогите пожалуйста разобраться.
Я передаю на сервер от клиента 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)


Офлайн

#2 Сен. 17, 2019 22:44:56

ffolax
Зарегистрирован: 2019-09-17
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

python socket передача файлов

Спасибо всем тем кто помог.

Проблема оказалась в том что сервер ожидает 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')

Офлайн

#3 Сен. 18, 2019 04:56:57

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

python socket передача файлов

ffolax
Спасибо всем тем кто помог.
Да ты свой код перечитай. Отправляешь код неправильно на форум.

Вот ты написал выше
# Check input JSON file;
if data == ‘–get-settings’:
print('IF')
else:
print(“ELSE”)
ни отступов нет, ни двойного дефиса, ни кавычек одинарных, ни кавычек двойных. И в этом должен кто-то разбираться? Вот сам скопируй его из своего сообщения и попробуй запустись в интерпретаторе. Он не запустится, потому что синтаксически неверный.

И форум тут ни при чём. Не знаешь, как пользоваться форумскими движками.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version