python socket многопоточность для нескольких пользователей

Рейтинг: 1Ответов: 0Опубликовано: 20.06.2023

приветы. у меня такая проблема, необходимо написать клиент - сервер на 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

Ответы

Ответов пока нет.