| # test asynchat -- requires threading | 
 |  | 
 | import thread # If this fails, we can't test this module | 
 | import asyncore, asynchat, socket, threading, time | 
 |  | 
 | HOST = "127.0.0.1" | 
 | PORT = 54321 | 
 |  | 
 | class echo_server(threading.Thread): | 
 |  | 
 |     def run(self): | 
 |         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
 |         sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | 
 |         sock.bind((HOST, PORT)) | 
 |         sock.listen(1) | 
 |         conn, client = sock.accept() | 
 |         buffer = "" | 
 |         while "\n" not in buffer: | 
 |             data = conn.recv(10) | 
 |             if not data: | 
 |                 break | 
 |             buffer = buffer + data | 
 |         while buffer: | 
 |             n = conn.send(buffer) | 
 |             buffer = buffer[n:] | 
 |         conn.close() | 
 |         sock.close() | 
 |  | 
 | class echo_client(asynchat.async_chat): | 
 |  | 
 |     def __init__(self): | 
 |         asynchat.async_chat.__init__(self) | 
 |         self.create_socket(socket.AF_INET, socket.SOCK_STREAM) | 
 |         self.connect((HOST, PORT)) | 
 |         self.set_terminator("\n") | 
 |         self.buffer = "" | 
 |  | 
 |     def handle_connect(self): | 
 |         print "Connected" | 
 |  | 
 |     def collect_incoming_data(self, data): | 
 |         self.buffer = self.buffer + data | 
 |  | 
 |     def found_terminator(self): | 
 |         print "Received:", `self.buffer` | 
 |         self.buffer = "" | 
 |         self.close() | 
 |  | 
 | def main(): | 
 |     s = echo_server() | 
 |     s.start() | 
 |     time.sleep(1) # Give server time to initialize | 
 |     c = echo_client() | 
 |     c.push("hello ") | 
 |     c.push("world\n") | 
 |     asyncore.loop() | 
 |  | 
 | main() |