Ошибка при отправке данных JSON через сокеты Python ⇐ Python
-
Anonymous
Ошибка при отправке данных JSON через сокеты Python
Кажется, я не могу найти здесь проблему. Пожалуйста помоги. Я хочу включить каждое слово в формате json и передать его на сервер, и сервер должен передать его всем подключенным клиентам. Он не передается на сервер другим клиентам.
**Вот мой клиентский код: **
сокет импорта импортировать JSON импорт потоков # Определите IP-адрес и порт сервера SERVER_IP = '44.216.25.181' СЕРВЕР_ПОРТ = 55555 # Создаём сокет для клиента client_socket = сокет.сокет(сокет.AF_INET, сокет.SOCK_STREAM) client_socket.connect((SERVER_IP, SERVER_PORT)) # Функция получения сообщений с сервера защита получения_сообщений(): пока правда: пытаться: сообщение = client_socket.recv(1024) если нет сообщения: перерыв decoded_message = json.loads(message.decode()) message_type = decoded_message.get('тип') данные = decoded_message.get('данные')` если тип_сообщения == 'текст_потока': # Обработка потокового текста print(f"Полученный текстовый поток: {data.get('chunk')}") кроме: перерыв # Запускаем поток для получения сообщений с сервера take_thread = threading.Thread(target=receive_messages) get_thread.start() # Пример метода отправки сообщения JSON на сервер защита send_message (тип, данные): пытаться: сообщение = {'тип': тип, 'данные': данные} json_data = json.dumps(сообщение) печать (json_data) client_socket.send(json_data.encode()) кроме исключения как e: печать("е") print("Соединение с сервером закрыто.") client_socket.close() защита printEvenLengthWords(s): #разбиение слов в заданной строке Words = s.split() # то же, что и s.split(' ') за слово словами: печать (слово) send_message('stream_text', слово) # строка ввода user_input = input("Введите текст:") # вызов функции printEvenLengthWords (user_input) Вот мой серверный код: сокет импорта импорт потоков импортировать JSON # Определите IP-адрес и порт сервера SERVER_IP = '0.0.0.0' СЕРВЕР_ПОРТ = 55555 # Создаем сокет для сервера server_socket = сокет.сокет(сокет.AF_INET, сокет.SOCK_STREAM) server_socket.bind((SERVER_IP, SERVER_PORT)) server_socket.listen() # Список для хранения подключенных клиентов клиенты = [] # Функция для трансляции сообщений всем подключенным клиентам def Broadcast (сообщение): для клиента в клиентах: client.send(сообщение) # Функция для обработки клиентских подключений защита handle_client(client_socket): пока правда: пытаться: # Получаем данные от клиента сообщение = client_socket.recv(1024) если нет сообщения: перерыв # Декодируем сообщение JSON decoded_message = json.loads(message.decode()) # Различать типы сообщений message_type = decoded_message.get('тип') данные = decoded_message.get('данные') если тип_сообщения == 'текст_потока': # Обработка потокового текста сгенерированный_текст = data.get('данные') print(f"Полученный текстовый поток: {generated_text}") # Трансляция потокового текста всем клиентам размер_куска = 5 chunks = [generated_text[i:i + chunk_size] для i в диапазоне (0, len(generated_text), chunk_size)] для куска кусками: chunk_message = json.dumps({'type': 'stream_text', 'data': {'кусок': кусок}}) трансляция (chunk_message) кроме: # Удалить клиента из списка, если произошла ошибка или обрыв соединения клиенты.удалить(client_socket) client_socket.close() перерыв # Принимаем входящие соединения и запускаем новый поток для каждого клиента пока правда: client_socket, client_address = server_socket.accept() клиенты.append(client_socket) client_thread = threading.Thread(target=handle_client, args=(client_socket,)) client_thread.start() Когда я запускаю код как на стороне клиента, так и на стороне сервера, я вижу только такой вывод json:
$ python3 client1.py Введите текст: это тест этот {"тип": "stream_text", "данные": "это"} является {"тип": "stream_text", "данные": "есть"} а {"тип": "stream_text", "данные": "а"} тест {"тип": "stream_text", "данные": "тест"}
Кажется, я не могу найти здесь проблему. Пожалуйста помоги. Я хочу включить каждое слово в формате json и передать его на сервер, и сервер должен передать его всем подключенным клиентам. Он не передается на сервер другим клиентам.
**Вот мой клиентский код: **
сокет импорта импортировать JSON импорт потоков # Определите IP-адрес и порт сервера SERVER_IP = '44.216.25.181' СЕРВЕР_ПОРТ = 55555 # Создаём сокет для клиента client_socket = сокет.сокет(сокет.AF_INET, сокет.SOCK_STREAM) client_socket.connect((SERVER_IP, SERVER_PORT)) # Функция получения сообщений с сервера защита получения_сообщений(): пока правда: пытаться: сообщение = client_socket.recv(1024) если нет сообщения: перерыв decoded_message = json.loads(message.decode()) message_type = decoded_message.get('тип') данные = decoded_message.get('данные')` если тип_сообщения == 'текст_потока': # Обработка потокового текста print(f"Полученный текстовый поток: {data.get('chunk')}") кроме: перерыв # Запускаем поток для получения сообщений с сервера take_thread = threading.Thread(target=receive_messages) get_thread.start() # Пример метода отправки сообщения JSON на сервер защита send_message (тип, данные): пытаться: сообщение = {'тип': тип, 'данные': данные} json_data = json.dumps(сообщение) печать (json_data) client_socket.send(json_data.encode()) кроме исключения как e: печать("е") print("Соединение с сервером закрыто.") client_socket.close() защита printEvenLengthWords(s): #разбиение слов в заданной строке Words = s.split() # то же, что и s.split(' ') за слово словами: печать (слово) send_message('stream_text', слово) # строка ввода user_input = input("Введите текст:") # вызов функции printEvenLengthWords (user_input) Вот мой серверный код: сокет импорта импорт потоков импортировать JSON # Определите IP-адрес и порт сервера SERVER_IP = '0.0.0.0' СЕРВЕР_ПОРТ = 55555 # Создаем сокет для сервера server_socket = сокет.сокет(сокет.AF_INET, сокет.SOCK_STREAM) server_socket.bind((SERVER_IP, SERVER_PORT)) server_socket.listen() # Список для хранения подключенных клиентов клиенты = [] # Функция для трансляции сообщений всем подключенным клиентам def Broadcast (сообщение): для клиента в клиентах: client.send(сообщение) # Функция для обработки клиентских подключений защита handle_client(client_socket): пока правда: пытаться: # Получаем данные от клиента сообщение = client_socket.recv(1024) если нет сообщения: перерыв # Декодируем сообщение JSON decoded_message = json.loads(message.decode()) # Различать типы сообщений message_type = decoded_message.get('тип') данные = decoded_message.get('данные') если тип_сообщения == 'текст_потока': # Обработка потокового текста сгенерированный_текст = data.get('данные') print(f"Полученный текстовый поток: {generated_text}") # Трансляция потокового текста всем клиентам размер_куска = 5 chunks = [generated_text[i:i + chunk_size] для i в диапазоне (0, len(generated_text), chunk_size)] для куска кусками: chunk_message = json.dumps({'type': 'stream_text', 'data': {'кусок': кусок}}) трансляция (chunk_message) кроме: # Удалить клиента из списка, если произошла ошибка или обрыв соединения клиенты.удалить(client_socket) client_socket.close() перерыв # Принимаем входящие соединения и запускаем новый поток для каждого клиента пока правда: client_socket, client_address = server_socket.accept() клиенты.append(client_socket) client_thread = threading.Thread(target=handle_client, args=(client_socket,)) client_thread.start() Когда я запускаю код как на стороне клиента, так и на стороне сервера, я вижу только такой вывод json:
$ python3 client1.py Введите текст: это тест этот {"тип": "stream_text", "данные": "это"} является {"тип": "stream_text", "данные": "есть"} а {"тип": "stream_text", "данные": "а"} тест {"тип": "stream_text", "данные": "тест"}
Мобильная версия