что я хочу:
сервер слушает порт (класс ear) и как только появляется соединение - создаёт класс mouth, который будет обмениваться информацией через это соединение. так же можно инициировать соединение самому (через словарь парамаетров класса mouth), задавая адрес назначения.
далее (теста ради) запускаем отдельным тредом asyncore.loop, а основным пытаемся законнектиться к серверу.
import socket,asyncore
class mouth(asyncore.dispatcher):
def __init__(self,**kwargs):
asyncore.dispatcher.__init__(self)
self.buffer=bytes()
if "sock" in kwargs:
self.socket=kwargs["sock"]
elif "host" in kwargs and "port" in kwargs:
self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
self.connect((kwargs["host"],kwargs["port"]))
self.buffer=bytes("YOINK!","utf-8")
def handle_connect(self):
pass
def handle_close(self):
self.close()
def handle_read(self):
print(self.recv(8192))
def writable(self):
return(len(self.buffer)>0)
def handle_write(self):
sent=self.send(self.buffer)
self.buffer=self.buffer[sent:]
class ear(asyncore.dispatcher):
def __init__(self,host,port):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
self.bind((host,port))
self.listen(5)
def handle_accepted(self,sock,addr):
print(repr(addr),sock.getsockname())
mouth(sock=sock)
if __name__=="__main__":
ear("localhost",5555)
import threading
threading.Thread(target=asyncore.loop).start()
mouth(host="127.0.0.1",port=5555)
('127.0.0.1', 3487) ('127.0.0.1', 5555)
b''
и ещё хотелось бы задать несколько вопросов касательно “архитектуры” asyncore:
- возможно ли добавлять сокеты в список, который анализирует asyncore.loop?
- если возможно, то как это делать и как разделять сокеты на те, которыми я “слушаю”, которыми “пишу” и т.д.
заранее спасибо!