#! /usr/bin/env python import sys import socket import asyncore from errno import ENOTCONN, ESHUTDOWN, ECONNABORTED # ECONNRESET has been removed from asyncore managed socket errors asyncore._DISCONNECTED = frozenset((ENOTCONN, ESHUTDOWN, ECONNABORTED)) MSG_SIZE = 1024 DATA = (MSG_SIZE * ' ' + '\n').encode() data_len = len(DATA) LOOP_TIMEOUT = .020 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(DATA) 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 writable(self): return False def handle_connect(self, *args): pass def handle_read(self): try: data = self.recv(data_len) except: self.handle_error() self.close() def main(): address = ('localhost', 3220) Server(address) Reader(address) asyncore.loop(timeout=LOOP_TIMEOUT) if __name__ == "__main__": try: data_len = int(sys.argv[1:][0]) except IndexError: pass main()