Программирование мультиплексного сокета в python - PullRequest
0 голосов
/ 14 июля 2020
#Server.py



import socket,types,selectors


sel =selectors.DefaultSelector()

with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as sc:
     sc.bind(("localhost",1845))
     sc.listen()
     print("listening on...")
     sc.setblocking(False)
     event=selectors.EVENT_READ|selectors.EVENT_WRITE
     sel.register(sc,event,data=None)

def select_detals(sock):
    server_message=bytes("Hello dear client, I am at your full services", encoding="utf-8")
    conn,addr=sc.accept()
    print("connected by",addr)
    sock.setblocking(False)
    event=selectors.EVENT_READ|selectors.EVENT_WRITE
    data=types.SimpleNamespace(addr=addr,inb=b'',outb=b'',server_message=server_message)
    sel.register(conn,event,data=data)


def service_connection(key,mask):
    sock=key.fileobj
    data=key.data
    if mask & selectors.EVENT_READ:
        receive=sock.recv(1024)
        if receive:
            print(f"received {receive.decode()} from client {data.addr}")
            data.inb+=receive
        else:
            print(f"disconnecting to {data.addr}")
            sel.unregister(sock)
            sock.close()

    if mask & selectors.EVENT_WRITE:
        data.outb=data.server_message
        if data.outb:
            data.outb+=data.server_message
            print('sending', data.outb.decode(), 'to ', data.addr)
            sock.setblocking(False)
            sc.sendall(data.outb)  # Should be ready to write

while True:
    event=sel.select(timeout=None)
    for key, mask in event:
        if key.data is None:
            select_detals(key.fileobj)
        else:
            service_connection(key, mask)

Клиент python файл

import types, selectors,socket


sel=selectors.DefaultSelector()
messages=[b'message1',b'message2']

def client_connection(host,port,num_conn):
server_addr=(host,port)
for i in range(0,num_conn):
    connid=i+1
    print(f"starting connection {connid} to {server_addr}")
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect_ex(server_addr)
    sock.setblocking(False)
    event=selectors.EVENT_READ|selectors.EVENT_WRITE
    data=types.SimpleNamespace(
    message=list(messages),
    connid=connid,
    rec_total=b'',
    message_total=sum(len(m) for m in messages),
    outb=b''

    )
    sel.register(sock,event,data=data)
def server_connection(key,mask):
sock=key.fileobj
data=key.data
if mask & selectors.EVENT_READ:
    receive=sock.recv(1024)
    if receive:
        print(f"received {receive.decode()} from connection {data.connid} from server:{                                              ('localhost',1845)}")
        data.rec_total+=receive
        print('closing connection', data.connid)
        sel.unregister(sock)
        sock.close()
if mask & selectors.EVENT_WRITE:
    sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock1.connect_ex(("localhost",1845))
    if not data.outb or data.message:
        data.outb=data.message.pop(data.connid-1)
        if data.outb:
            print('sending', repr(data.outb), 'to connection', data.connid)
            sock1.sendall(data.outb)  # Should be ready to write



   client_connection("localhost",1845,2)
   for key, mask in sel.select():
       if not key.data.outb:
         server_connection(key, mask)

Клиент успешно записывает обратно на сервер, но то же самое не относится к серверу, поскольку я продолжал получать эту ошибку

OSError: [WinError 10057] A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied   

У меня есть два python файла по программированию мультиплексных сокетов. У меня есть клиент, отправляющий два простых сообщения на сервер, это было успешно. Если я пытаюсь ответить клиенту с сервера, я продолжаю получать ошибки. Ошибка выделена ниже. Мы приветствуем любую помощь в решении этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...