Name
send
Synopsis
d
.send(data
)
In class dispatcher_with_send
, method
d
.send
is equivalent to
a socket object’s method send_all
in that it sends all the data. However,
d
.send
does not send
all the data at once and does not block; rather,
d
sends the data in small packets of 512
bytes each in response to handle_write
events
(callbacks). This strategy ensures good performance in simple cases.
Example 19-7 uses module asyncore
to reimplement the server of Example 19-1, with the
added ability to serve any number of clients simultaneously.
Example 19-7. Asynchronous TCP echo server using asyncore
import asyncore import socket class MainServerSocket(asyncore.dispatcher): def __init_ _(self, port): asyncore.dispatcher.__init_ _(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.bind(('',port)) self.listen(5) def handle_accept(self): newSocket, address = self.accept( ) print "Connected from", address SecondaryServerSocket(newSocket) class SecondaryServerSocket(asyncore.dispatcher_with_send): def handle_read(self): receivedData = self.recv(8192) if receivedData: self.send(receivedData) else: self.close( ) def handle_close(self): print "Disconnected from", self.getpeername( ) MainServerSocket(8881) asyncore.loop( )
The complexity of Example 19-7 is modest, comparable with that of Example 19-1. The additional functionality of serving multiple clients simultaneously, with the high performance and scalability of asynchronous event-driven programming, comes quite cheaply thanks to ...
Get Python in a Nutshell now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.