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 ...