-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.py
More file actions
60 lines (47 loc) · 2.16 KB
/
Copy pathserver.py
File metadata and controls
60 lines (47 loc) · 2.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import asyncio
# Храним всех подключенных клиентов: {адрес_строка: writer_объект}
clients = {}
async def handle_client(reader, writer):
# Получаем уникальный адрес (IP, Port)
addr = writer.get_extra_info('peername')
# Превращаем в строку для удобства использования как ID (например "127.0.0.1:54321")
user_id = f"{addr[0]}:{addr[1]}"
clients[user_id] = writer
print(f"Новый игрок: {user_id}")
try:
while True:
data = await reader.read(100)
if not data:
break
# Получили координаты "x,y"
msg = data.decode()
# Формируем сообщение для всех: "ID_ИГРОКА|X,Y"
# Используем разделитель |, чтобы клиент понял, где ID, а где координаты
broadcast_msg = f"{user_id}|{msg}\n" # добавляем перенос строки
print(f"Рассылка: {broadcast_msg}")
# Рассылаем ВСЕМ подключенным клиентам
for c_id, c_writer in clients.items():
try:
c_writer.write(broadcast_msg.encode())
await c_writer.drain()
except:
# Если отправка не удалась, удалим потом (здесь упрощено)
pass
except ConnectionResetError:
pass
finally:
print(f"Игрок {user_id} вышел")
if user_id in clients:
del clients[user_id]
writer.close()
async def main():
server = await asyncio.start_server(handle_client, '127.0.0.1', 8888)
addr = server.sockets[0].getsockname()
print(f'Сервер запущен на {addr}')
async with server:
await server.serve_forever()
if __name__ == '__main__':
try:
asyncio.run(main())
except KeyboardInterrupt:
pass