Сервер и клиент AsyncioPython

Программы на Python
Ответить
Anonymous
 Сервер и клиент Asyncio

Сообщение Anonymous »

Вот демо-версия, реализующая связь между клиентом и сервером.

Код: Выделить всё

import asyncio
import json
import time

reader = None
writer = None
ip = '127.0.0.1'
port = 8889

async def handle_input():
while True:
user_input = input("[You]: ")
await send_message(user_input)

async def send_message(message):
if not reader or not writer:
print("[Error]: Not connected to the message server.")
return

try:
message_data = {
"sender": "name",
"message": message
}
request_data = json.dumps(message_data)
writer.write(request_data.encode('utf-8'))
await writer.drain()

print(f"[Info]: Message sent: {message}")

except Exception as e:
print(f"[Error]: Failed to send message. Error: {e}")

async def message_test():

global reader, writer
try:

reader, writer = await asyncio.open_connection(ip, port)
print(f"[Info]: Connected to the conference message server")

await handle_input()

except Exception as e:
print(f"[Error]: Failed to start the conference client. Error: {e}")

if __name__ == "__main__":
asyncio.run(message_test())
Выше приведен код клиента

Код: Выделить всё

import asyncio
import json

clients = []

async def handle_client(reader, writer):

addr = writer.get_extra_info('peername')
print(f"[Info]: New connection from {addr}")

clients.append((reader, writer))

try:
while True:
data = await reader.read(100)
if not data:
break
message = data.decode('utf-8')
print(f"[Info]: Received message: {message}")

except asyncio.CancelledError:
pass
finally:

clients.remove((reader, writer))
print(f"[Info]: Connection closed by {addr}")
writer.close()
await writer.wait_closed()

async def start_server():
server = await asyncio.start_server(
handle_client, '127.0.0.1', 8889
)
addr = server.sockets[0].getsockname()
print(f"[Info]: Server started on {addr}")

async with server:
await server.serve_forever()

if __name__ == "__main__":
asyncio.run(start_server())
Выше приведен код сервера.
Когда программа запускается, клиент получает пользовательское сообщение из входных данных и отправляет его на сервер. При первом входе в цикл while сервер успешно получает сообщение. Во второй раз и следующие несколько раз клиент может напечатать «[Информация]: Сообщение отправлено: {сообщение}», но сервер не получил сообщение. сообщение.
Интересно, почему это происходит
Я пытался изменить цикл while на

Код: Выделить всё

user_input = input("[You]: ")
await send_message(user_input)

user_input = input("[You]: ")
await send_message(user_input)
Затем сервер успешно получает сообщение оба раза.

Подробнее здесь: https://stackoverflow.com/questions/792 ... and-client
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»