#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 файла по программированию мультиплексных сокетов. У меня есть клиент, отправляющий два простых сообщения на сервер, это было успешно. Если я пытаюсь ответить клиенту с сервера, я продолжаю получать ошибки. Ошибка выделена ниже. Мы приветствуем любую помощь в решении этой проблемы.