python socket многопоточность для нескольких пользователей
приветы. у меня такая проблема, необходимо написать клиент - сервер на python. сервер должен читать из файла строки.
клиент отправляет серверу статус "svoboden", сервер в ответ отправляет первую строку из файла. конектится второй клиент и отправляет статус "svoboden", получает вторую строку из файла. освобождается первый клиент и отправляет статус "svoboden", получает третью строчку от сервера. и так далее. клиентов может быть и больше, строчки дублироваться не должны. "одна строчка в одни руки"
что смог сам:
Сервер
#!/usr/bin/env python3
import sys
import socket
import selectors
import types
sel = selectors.DefaultSelector()
def accept_wrapper(sock):
conn, addr = sock.accept() # Should be ready to read
print(f"Accepted connection from {addr}")
conn.setblocking(False)
data = types.SimpleNamespace(addr=addr, inb=b"", outb=b"")
events = selectors.EVENT_READ | selectors.EVENT_WRITE
sel.register(conn, events, data=data)
def service_connection(key, mask, item):
sock = key.fileobj
data = key.data
if mask & selectors.EVENT_READ:
recv_data = sock.recv(1024) # Should be ready to read
if recv_data:
data.outb += recv_data
else:
print(f"Closing connection to {data.addr}")
sel.unregister(sock)
sock.close()
if mask & selectors.EVENT_WRITE:
if data.outb:
print(f"con {data.outb!r} to {data.addr}")
sent = sock.send(bytes(item, encoding = 'utf-8')) # Should be ready to write
data.outb = data.outb[sent:]
host = ''
port = 9095
lsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
lsock.bind((host, port))
lsock.listen()
print(f"Listening on {(host, port)}")
lsock.setblocking(False)
sel.register(lsock, selectors.EVENT_READ, data=None)
ips = open('res.txt', mode='r', encoding="utf-8")
for item in ips:
try:
while True:
events = sel.select(timeout=None)
for key, mask in events:
if key.data is None:
accept_wrapper(key.fileobj)
else:
service_connection(key, mask, item)
except KeyboardInterrupt:
print("Caught keyboard interrupt, exiting")
finally:
sel.close()
клиент
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
#подключаемся
HOST = "хх.хх.хх.хх" # The server's hostname or IP address
PORT = 9095 # The port used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
#шлем что мы свободны
s.send(b"svoboden")
data = s.recv(1024)
print(f"{data!r}")
оно в принципе работает, но всегда отправляется только первая строчка. нужно как то сделать очередь, но сколько не бьюсь не выходит
помогите пожалуйста HELP PLZZZZ
Источник: Stack Overflow на русском