diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2013-12-03 00:46:39 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2013-12-03 00:46:39 (GMT) |
commit | 0c6f1ca40c9f0d7720328d67bc34510cb6a8a309 (patch) | |
tree | 1b653a733992f970f41894814604c1042d023a44 /Doc | |
parent | 3e09e32c8a9f4971b3fe89e9c20aa05fe4275bf1 (diff) | |
download | cpython-0c6f1ca40c9f0d7720328d67bc34510cb6a8a309.zip cpython-0c6f1ca40c9f0d7720328d67bc34510cb6a8a309.tar.gz cpython-0c6f1ca40c9f0d7720328d67bc34510cb6a8a309.tar.bz2 |
asyncio doc: write a complete TCP echo example, client and server
Example based on tcp_echo.py example from Tulip source code.
Diffstat (limited to 'Doc')
-rw-r--r-- | Doc/library/asyncio-eventloop.rst | 2 | ||||
-rw-r--r-- | Doc/library/asyncio-protocol.rst | 116 |
2 files changed, 72 insertions, 46 deletions
diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index eef9aa1..6325f3d 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -150,7 +150,7 @@ a different clock than :func:`time.time`. Creating connections -^^^^^^^^^^^^^^^^^^^^ +-------------------- .. method:: BaseEventLoop.create_connection(protocol_factory, host=None, port=None, \*, ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None) diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index 5b0fdfa..f3921f5 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -20,8 +20,8 @@ subprocess pipes. The methods available on a transport depend on the transport's kind. -BaseTransport: Methods common to all transports ------------------------------------------------ +BaseTransport +------------- .. class:: BaseTransport @@ -75,8 +75,8 @@ BaseTransport: Methods common to all transports - ``'subprocess'``: :class:`subprocess.Popen` instance -ReadTransport: Methods of readable streaming transports -------------------------------------------------------- +ReadTransport +------------- .. class:: ReadTransport @@ -94,8 +94,8 @@ ReadTransport: Methods of readable streaming transports will be called once again if some data is available for reading. -WriteTransport: Methods of writable streaming transports --------------------------------------------------------- +WriteTransport +-------------- .. class:: WriteTransport @@ -159,8 +159,8 @@ WriteTransport: Methods of writable streaming transports (e.g. SSL) doesn't support half-closes. -DatagramTransport: Methods of datagram transports -------------------------------------------------- +DatagramTransport +----------------- .. method:: DatagramTransport.sendto(data, addr=None) @@ -179,8 +179,8 @@ DatagramTransport: Methods of datagram transports called with :const:`None` as its argument. -Methods of subprocess transports --------------------------------- +BaseSubprocessTransport +----------------------- .. class:: BaseSubprocessTransport @@ -224,8 +224,8 @@ Methods of subprocess transports On Windows, this method is an alias for :meth:`terminate`. -Stream reader -------------- +StreamWriter +------------ .. class:: StreamWriter(transport, protocol, reader, loop) @@ -286,8 +286,8 @@ Stream reader see :meth:`WriteTransport.write_eof`. -Stream writer -------------- +StreamReader +------------ .. class:: StreamReader(limit=_DEFAULT_LIMIT, loop=None) @@ -418,11 +418,8 @@ instances: Called when the child process has exited. -Data reception callbacks ------------------------- - Streaming protocols -^^^^^^^^^^^^^^^^^^^ +------------------- The following callbacks are called on :class:`Protocol` instances: @@ -458,7 +455,7 @@ a connection. However, :meth:`eof_received` is called at most once and, if called, :meth:`data_received` won't be called after it. Datagram protocols -^^^^^^^^^^^^^^^^^^ +------------------ The following callbacks are called on :class:`DatagramProtocol` instances. @@ -576,40 +573,69 @@ Network functions This function returns a :ref:`coroutine <coroutine>`. -Example: Echo server --------------------- -A :class:`Protocol` implementing an echo server:: +Protocol example: TCP echo client and server +============================================ + +Echo server +----------- + +TCP echo server example:: + + import asyncio + + class EchoServer(asyncio.Protocol): + def timeout(self): + print('connection timeout, closing.') + self.transport.close() + + def connection_made(self, transport): + print('connection made') + self.transport = transport + + # close the client connection after 2 seconds + asyncio.get_event_loop().call_later(2.0, self.timeout) + + def data_received(self, data): + print('data received:', data.decode()) + self.transport.write(data) + + def connection_lost(self, exc): + print('connection lost') + + + loop = asyncio.get_event_loop() + f = loop.create_server(EchoServer, '127.0.0.1', 8888) + s = loop.run_until_complete(f) + print('serving on', s.sockets[0].getsockname()) + loop.run_forever() - class EchoServer(asyncio.Protocol): - TIMEOUT = 5.0 +Echo client +----------- - def timeout(self): - print('connection timeout, closing.') - self.transport.close() +TCP echo client example:: - def connection_made(self, transport): - print('connection made') - self.transport = transport + import asyncio - # start 5 seconds timeout timer - self.h_timeout = asyncio.get_event_loop().call_later( - self.TIMEOUT, self.timeout) + class EchoClient(asyncio.Protocol): + message = 'This is the message. It will be echoed.' - def data_received(self, data): - print('data received: ', data.decode()) - self.transport.write(b'Re: ' + data) + def connection_made(self, transport): + self.transport = transport + self.transport.write(self.message.encode()) + print('data sent:', self.message) - # restart timeout timer - self.h_timeout.cancel() - self.h_timeout = asyncio.get_event_loop().call_later( - self.TIMEOUT, self.timeout) + def data_received(self, data): + print('data received:', data.decode()) - def eof_received(self): - pass + def connection_lost(self, exc): + print('connection lost') + asyncio.get_event_loop().stop() - def connection_lost(self, exc): - print('connection lost:', exc) - self.h_timeout.cancel() + loop = asyncio.get_event_loop() + task = loop.create_connection(EchoClient, '127.0.0.1', 8888) + loop.run_until_complete(task) + loop.run_forever() + loop.close() |