Найти - Пользователи
Полная версия: python socket передача файлов
Начало » Python для новичков » python socket передача файлов
1
ffolax
Добрый день. Помогите пожалуйста разобраться.
Я передаю на сервер от клиента 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)


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

Проблема оказалась в том что сервер ожидает 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')
py.user.next
ffolax
Спасибо всем тем кто помог.
Да ты свой код перечитай. Отправляешь код неправильно на форум.

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

И форум тут ни при чём. Не знаешь, как пользоваться форумскими движками.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB