import socket import asyncore import traceback class Server(asyncore.dispatcher): def __init__(self, address): asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.set_reuse_addr() self.bind(address) self.listen(1) def handle_accept(self): sock, addr = self.accept() Writer(sock) self.close() class Writer(asyncore.dispatcher): def __init__(self, sock): asyncore.dispatcher.__init__(self, sock) def handle_write(self): self.send(b'\0\0') class Reader(asyncore.dispatcher): def __init__(self, address): asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.connect(address) def handle_connect_event(self): call_stack = '->'.join((f[2] for f in traceback.extract_stack())) print('call stack in handle_connect_event:\n%s' % call_stack) asyncore.dispatcher.handle_connect_event(self) def handle_read(self): print('self.addr after connection: %s' % str(self.addr)) self.recv(1) self.close() def main(): address = ('localhost', 3220) Server(address) Reader(address) asyncore.loop(timeout=0.020) if __name__ == "__main__": main()