blob: 3aa1f2f2e99647a61a5aeba39c98d6fecc616f82 [file] [log] [blame]
R David Murray6a143812013-12-20 14:37:39 -05001.. currentmodule:: asyncio
Victor Stinnerea3183f2013-12-03 01:08:00 +01002
lf627d2c82017-07-25 17:03:51 -06003+++++++++++++++++++++++++++++++++++++++++++++
4Transports and protocols (callback based API)
5+++++++++++++++++++++++++++++++++++++++++++++
6
7**Source code:** :source:`Lib/asyncio/transports.py`
8
9**Source code:** :source:`Lib/asyncio/protocols.py`
Victor Stinner1ca5ba62013-12-03 01:49:43 +010010
Victor Stinner9592edb2014-02-02 15:03:02 +010011.. _asyncio-transport:
Victor Stinnerea3183f2013-12-03 01:08:00 +010012
13Transports
14==========
15
Guido van Rossum589872c2014-03-29 21:14:04 -070016Transports are classes provided by :mod:`asyncio` in order to abstract
Victor Stinnerea3183f2013-12-03 01:08:00 +010017various kinds of communication channels. You generally won't instantiate
Martin Panterd210a702016-08-20 08:03:06 +000018a transport yourself; instead, you will call an :class:`AbstractEventLoop` method
Victor Stinnerea3183f2013-12-03 01:08:00 +010019which will create the transport and try to initiate the underlying
20communication channel, calling you back when it succeeds.
21
22Once the communication channel is established, a transport is always
Victor Stinner9592edb2014-02-02 15:03:02 +010023paired with a :ref:`protocol <asyncio-protocol>` instance. The protocol can
Victor Stinnerea3183f2013-12-03 01:08:00 +010024then call the transport's methods for various purposes.
25
26:mod:`asyncio` currently implements transports for TCP, UDP, SSL, and
27subprocess pipes. The methods available on a transport depend on
28the transport's kind.
29
Victor Stinner83704962015-02-25 14:24:15 +010030The transport classes are :ref:`not thread safe <asyncio-multithreading>`.
31
Yury Selivanov3432f2f2016-12-12 16:44:58 -050032.. versionchanged:: 3.6
33 The socket option ``TCP_NODELAY`` is now set by default.
34
Victor Stinnerea3183f2013-12-03 01:08:00 +010035
Victor Stinner0c6f1ca2013-12-03 01:46:39 +010036BaseTransport
37-------------
Victor Stinnerea3183f2013-12-03 01:08:00 +010038
39.. class:: BaseTransport
40
41 Base class for transports.
42
Mariatta091b84f2017-02-27 05:44:15 -080043 .. method:: close()
Victor Stinnerea3183f2013-12-03 01:08:00 +010044
45 Close the transport. If the transport has a buffer for outgoing
46 data, buffered data will be flushed asynchronously. No more data
47 will be received. After all buffered data is flushed, the
48 protocol's :meth:`connection_lost` method will be called with
49 :const:`None` as its argument.
50
Mariatta091b84f2017-02-27 05:44:15 -080051 .. method:: is_closing()
Yury Selivanov1744d532015-11-16 12:46:41 -050052
53 Return ``True`` if the transport is closing or is closed.
54
Yury Selivanov344904c2015-11-16 12:47:15 -050055 .. versionadded:: 3.5.1
Victor Stinnerea3183f2013-12-03 01:08:00 +010056
57 .. method:: get_extra_info(name, default=None)
58
59 Return optional transport information. *name* is a string representing
60 the piece of transport-specific information to get, *default* is the
61 value to return if the information doesn't exist.
62
63 This method allows transport implementations to easily expose
64 channel-specific information.
65
66 * socket:
67
68 - ``'peername'``: the remote address to which the socket is connected,
69 result of :meth:`socket.socket.getpeername` (``None`` on error)
70 - ``'socket'``: :class:`socket.socket` instance
71 - ``'sockname'``: the socket's own address,
72 result of :meth:`socket.socket.getsockname`
73
74 * SSL socket:
75
76 - ``'compression'``: the compression algorithm being used as a string,
77 or ``None`` if the connection isn't compressed; result of
78 :meth:`ssl.SSLSocket.compression`
79 - ``'cipher'``: a three-value tuple containing the name of the cipher
80 being used, the version of the SSL protocol that defines its use, and
81 the number of secret bits being used; result of
82 :meth:`ssl.SSLSocket.cipher`
83 - ``'peercert'``: peer certificate; result of
84 :meth:`ssl.SSLSocket.getpeercert`
85 - ``'sslcontext'``: :class:`ssl.SSLContext` instance
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +020086 - ``'ssl_object'``: :class:`ssl.SSLObject` or :class:`ssl.SSLSocket`
87 instance
Victor Stinnerea3183f2013-12-03 01:08:00 +010088
89 * pipe:
90
91 - ``'pipe'``: pipe object
92
93 * subprocess:
94
95 - ``'subprocess'``: :class:`subprocess.Popen` instance
96
Berker Peksag2ebd6fe2016-11-07 23:36:14 +030097 .. method:: set_protocol(protocol)
INADA Naoki1ea023e2016-11-04 16:33:47 +090098
99 Set a new protocol. Switching protocol should only be done when both
100 protocols are documented to support the switch.
101
Berker Peksag2ebd6fe2016-11-07 23:36:14 +0300102 .. versionadded:: 3.5.3
INADA Naoki1ea023e2016-11-04 16:33:47 +0900103
Berker Peksag2ebd6fe2016-11-07 23:36:14 +0300104 .. method:: get_protocol
INADA Naoki1ea023e2016-11-04 16:33:47 +0900105
106 Return the current protocol.
107
Berker Peksag2ebd6fe2016-11-07 23:36:14 +0300108 .. versionadded:: 3.5.3
INADA Naoki1ea023e2016-11-04 16:33:47 +0900109
Victor Stinner04ce06b2015-09-21 18:27:52 +0200110 .. versionchanged:: 3.5.1
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200111 ``'ssl_object'`` info was added to SSL sockets.
112
Victor Stinnerea3183f2013-12-03 01:08:00 +0100113
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100114ReadTransport
115-------------
Victor Stinnerea3183f2013-12-03 01:08:00 +0100116
117.. class:: ReadTransport
118
119 Interface for read-only transports.
120
Yury Selivanovd757aaf2017-12-18 17:03:23 -0500121 .. method:: is_reading()
122
123 Return ``True`` if the transport is receiving new data.
124
125 .. versionadded:: 3.7
126
Victor Stinnerea3183f2013-12-03 01:08:00 +0100127 .. method:: pause_reading()
128
129 Pause the receiving end of the transport. No data will be passed to
Victor Stinner51f31292014-03-21 17:17:15 +0100130 the protocol's :meth:`data_received` method until :meth:`resume_reading`
Victor Stinnerea3183f2013-12-03 01:08:00 +0100131 is called.
132
Yury Selivanovd757aaf2017-12-18 17:03:23 -0500133 .. versionchanged:: 3.7
134 The method is idempotent, i.e. it can be called when the
135 transport is already paused or closed.
136
Victor Stinnerea3183f2013-12-03 01:08:00 +0100137 .. method:: resume_reading()
138
139 Resume the receiving end. The protocol's :meth:`data_received` method
140 will be called once again if some data is available for reading.
141
Yury Selivanovd757aaf2017-12-18 17:03:23 -0500142 .. versionchanged:: 3.7
143 The method is idempotent, i.e. it can be called when the
144 transport is already reading.
145
Victor Stinnerea3183f2013-12-03 01:08:00 +0100146
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100147WriteTransport
148--------------
Victor Stinnerea3183f2013-12-03 01:08:00 +0100149
150.. class:: WriteTransport
151
152 Interface for write-only transports.
153
154 .. method:: abort()
155
156 Close the transport immediately, without waiting for pending operations
157 to complete. Buffered data will be lost. No more data will be received.
158 The protocol's :meth:`connection_lost` method will eventually be
159 called with :const:`None` as its argument.
160
161 .. method:: can_write_eof()
162
163 Return :const:`True` if the transport supports :meth:`write_eof`,
164 :const:`False` if not.
165
166 .. method:: get_write_buffer_size()
167
168 Return the current size of the output buffer used by the transport.
169
Victor Stinner52bb9492014-08-26 00:22:28 +0200170 .. method:: get_write_buffer_limits()
171
172 Get the *high*- and *low*-water limits for write flow control. Return a
173 tuple ``(low, high)`` where *low* and *high* are positive number of
174 bytes.
175
176 Use :meth:`set_write_buffer_limits` to set the limits.
177
178 .. versionadded:: 3.4.2
179
Victor Stinnerea3183f2013-12-03 01:08:00 +0100180 .. method:: set_write_buffer_limits(high=None, low=None)
181
182 Set the *high*- and *low*-water limits for write flow control.
183
Kojo Idrissa5200a7c2017-06-20 14:32:00 -0500184 These two values (measured in number of
185 bytes) control when the protocol's
Victor Stinnerea3183f2013-12-03 01:08:00 +0100186 :meth:`pause_writing` and :meth:`resume_writing` methods are called.
187 If specified, the low-water limit must be less than or equal to the
188 high-water limit. Neither *high* nor *low* can be negative.
189
Kojo Idrissa5200a7c2017-06-20 14:32:00 -0500190 :meth:`pause_writing` is called when the buffer size becomes greater
191 than or equal to the *high* value. If writing has been paused,
192 :meth:`resume_writing` is called when the buffer size becomes less
193 than or equal to the *low* value.
194
Victor Stinnerea3183f2013-12-03 01:08:00 +0100195 The defaults are implementation-specific. If only the
Serhiy Storchakad65c9492015-11-02 14:10:23 +0200196 high-water limit is given, the low-water limit defaults to an
Victor Stinnerea3183f2013-12-03 01:08:00 +0100197 implementation-specific value less than or equal to the
198 high-water limit. Setting *high* to zero forces *low* to zero as
199 well, and causes :meth:`pause_writing` to be called whenever the
200 buffer becomes non-empty. Setting *low* to zero causes
201 :meth:`resume_writing` to be called only once the buffer is empty.
202 Use of zero for either limit is generally sub-optimal as it
203 reduces opportunities for doing I/O and computation
204 concurrently.
205
Victor Stinner52bb9492014-08-26 00:22:28 +0200206 Use :meth:`get_write_buffer_limits` to get the limits.
207
Victor Stinnerea3183f2013-12-03 01:08:00 +0100208 .. method:: write(data)
209
210 Write some *data* bytes to the transport.
211
212 This method does not block; it buffers the data and arranges for it
213 to be sent out asynchronously.
214
215 .. method:: writelines(list_of_data)
216
217 Write a list (or any iterable) of data bytes to the transport.
218 This is functionally equivalent to calling :meth:`write` on each
219 element yielded by the iterable, but may be implemented more efficiently.
220
221 .. method:: write_eof()
222
223 Close the write end of the transport after flushing buffered data.
224 Data may still be received.
225
226 This method can raise :exc:`NotImplementedError` if the transport
227 (e.g. SSL) doesn't support half-closes.
228
229
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100230DatagramTransport
231-----------------
Victor Stinnerea3183f2013-12-03 01:08:00 +0100232
233.. method:: DatagramTransport.sendto(data, addr=None)
234
235 Send the *data* bytes to the remote peer given by *addr* (a
236 transport-dependent target address). If *addr* is :const:`None`, the
237 data is sent to the target address given on transport creation.
238
239 This method does not block; it buffers the data and arranges for it
240 to be sent out asynchronously.
241
242.. method:: DatagramTransport.abort()
243
244 Close the transport immediately, without waiting for pending operations
245 to complete. Buffered data will be lost. No more data will be received.
246 The protocol's :meth:`connection_lost` method will eventually be
247 called with :const:`None` as its argument.
248
249
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100250BaseSubprocessTransport
251-----------------------
Victor Stinnerea3183f2013-12-03 01:08:00 +0100252
253.. class:: BaseSubprocessTransport
254
255 .. method:: get_pid()
256
257 Return the subprocess process id as an integer.
258
Victor Stinnerea3183f2013-12-03 01:08:00 +0100259 .. method:: get_pipe_transport(fd)
260
Brian Curtina1afeec2014-02-08 18:36:14 -0600261 Return the transport for the communication pipe corresponding to the
Victor Stinner4270a242014-10-13 23:56:43 +0200262 integer file descriptor *fd*:
263
264 * ``0``: readable streaming transport of the standard input (*stdin*),
265 or :const:`None` if the subprocess was not created with ``stdin=PIPE``
266 * ``1``: writable streaming transport of the standard output (*stdout*),
267 or :const:`None` if the subprocess was not created with ``stdout=PIPE``
268 * ``2``: writable streaming transport of the standard error (*stderr*),
269 or :const:`None` if the subprocess was not created with ``stderr=PIPE``
270 * other *fd*: :const:`None`
Victor Stinnerea3183f2013-12-03 01:08:00 +0100271
Victor Stinner933a8c82013-12-03 01:59:38 +0100272 .. method:: get_returncode()
273
274 Return the subprocess returncode as an integer or :const:`None`
275 if it hasn't returned, similarly to the
276 :attr:`subprocess.Popen.returncode` attribute.
277
Mariatta091b84f2017-02-27 05:44:15 -0800278 .. method:: kill()
Victor Stinner933a8c82013-12-03 01:59:38 +0100279
Martin Panterd21e0b52015-10-10 10:36:22 +0000280 Kill the subprocess, as in :meth:`subprocess.Popen.kill`.
Victor Stinner933a8c82013-12-03 01:59:38 +0100281
282 On POSIX systems, the function sends SIGKILL to the subprocess.
283 On Windows, this method is an alias for :meth:`terminate`.
284
Victor Stinnerea3183f2013-12-03 01:08:00 +0100285 .. method:: send_signal(signal)
286
287 Send the *signal* number to the subprocess, as in
288 :meth:`subprocess.Popen.send_signal`.
289
290 .. method:: terminate()
291
292 Ask the subprocess to stop, as in :meth:`subprocess.Popen.terminate`.
293 This method is an alias for the :meth:`close` method.
294
295 On POSIX systems, this method sends SIGTERM to the subprocess.
296 On Windows, the Windows API function TerminateProcess() is called to
297 stop the subprocess.
298
Victor Stinner4270a242014-10-13 23:56:43 +0200299 .. method:: close()
300
301 Ask the subprocess to stop by calling the :meth:`terminate` method if the
302 subprocess hasn't returned yet, and close transports of all pipes
303 (*stdin*, *stdout* and *stderr*).
304
Victor Stinnerea3183f2013-12-03 01:08:00 +0100305
Victor Stinner9592edb2014-02-02 15:03:02 +0100306.. _asyncio-protocol:
Victor Stinnerea3183f2013-12-03 01:08:00 +0100307
308Protocols
309=========
310
311:mod:`asyncio` provides base classes that you can subclass to implement
312your network protocols. Those classes are used in conjunction with
Victor Stinner9592edb2014-02-02 15:03:02 +0100313:ref:`transports <asyncio-transport>` (see below): the protocol parses incoming
Victor Stinnerea3183f2013-12-03 01:08:00 +0100314data and asks for the writing of outgoing data, while the transport is
315responsible for the actual I/O and buffering.
316
317When subclassing a protocol class, it is recommended you override certain
318methods. Those methods are callbacks: they will be called by the transport
319on certain events (for example when some data is received); you shouldn't
320call them yourself, unless you are implementing a transport.
321
322.. note::
323 All callbacks have default implementations, which are empty. Therefore,
324 you only need to implement the callbacks for the events in which you
325 are interested.
326
327
328Protocol classes
329----------------
330
331.. class:: Protocol
332
333 The base class for implementing streaming protocols (for use with
334 e.g. TCP and SSL transports).
335
336.. class:: DatagramProtocol
337
338 The base class for implementing datagram protocols (for use with
339 e.g. UDP transports).
340
341.. class:: SubprocessProtocol
342
343 The base class for implementing protocols communicating with child
344 processes (through a set of unidirectional pipes).
345
346
347Connection callbacks
348--------------------
349
Victor Stinner15386652014-06-10 09:19:26 +0200350These callbacks may be called on :class:`Protocol`, :class:`DatagramProtocol`
351and :class:`SubprocessProtocol` instances:
Victor Stinnerea3183f2013-12-03 01:08:00 +0100352
353.. method:: BaseProtocol.connection_made(transport)
354
355 Called when a connection is made.
356
357 The *transport* argument is the transport representing the
358 connection. You are responsible for storing it somewhere
359 (e.g. as an attribute) if you need to.
360
361.. method:: BaseProtocol.connection_lost(exc)
362
363 Called when the connection is lost or closed.
364
365 The argument is either an exception object or :const:`None`.
366 The latter means a regular EOF is received, or the connection was
367 aborted or closed by this side of the connection.
368
Victor Stinner15386652014-06-10 09:19:26 +0200369:meth:`~BaseProtocol.connection_made` and :meth:`~BaseProtocol.connection_lost`
370are called exactly once per successful connection. All other callbacks will be
371called between those two methods, which allows for easier resource management
372in your protocol implementation.
Victor Stinnerea3183f2013-12-03 01:08:00 +0100373
374The following callbacks may be called only on :class:`SubprocessProtocol`
375instances:
376
377.. method:: SubprocessProtocol.pipe_data_received(fd, data)
378
379 Called when the child process writes data into its stdout or stderr pipe.
380 *fd* is the integer file descriptor of the pipe. *data* is a non-empty
381 bytes object containing the data.
382
383.. method:: SubprocessProtocol.pipe_connection_lost(fd, exc)
384
385 Called when one of the pipes communicating with the child process
386 is closed. *fd* is the integer file descriptor that was closed.
387
388.. method:: SubprocessProtocol.process_exited()
389
390 Called when the child process has exited.
391
392
Victor Stinnerea3183f2013-12-03 01:08:00 +0100393Streaming protocols
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100394-------------------
Victor Stinnerea3183f2013-12-03 01:08:00 +0100395
396The following callbacks are called on :class:`Protocol` instances:
397
398.. method:: Protocol.data_received(data)
399
400 Called when some data is received. *data* is a non-empty bytes object
401 containing the incoming data.
402
403 .. note::
404 Whether the data is buffered, chunked or reassembled depends on
405 the transport. In general, you shouldn't rely on specific semantics
406 and instead make your parsing generic and flexible enough. However,
407 data is always received in the correct order.
408
409.. method:: Protocol.eof_received()
410
Barry Warsawdd9a0a12017-04-07 14:18:14 -0400411 Called when the other end signals it won't send any more data
Victor Stinnerea3183f2013-12-03 01:08:00 +0100412 (for example by calling :meth:`write_eof`, if the other end also uses
413 asyncio).
414
Serhiy Storchakaecf41da2016-10-19 16:29:26 +0300415 This method may return a false value (including ``None``), in which case
Victor Stinnerea3183f2013-12-03 01:08:00 +0100416 the transport will close itself. Conversely, if this method returns a
417 true value, closing the transport is up to the protocol. Since the
Serhiy Storchakaecf41da2016-10-19 16:29:26 +0300418 default implementation returns ``None``, it implicitly closes the connection.
Victor Stinnerea3183f2013-12-03 01:08:00 +0100419
420 .. note::
421 Some transports such as SSL don't support half-closed connections,
422 in which case returning true from this method will not prevent closing
423 the connection.
424
425:meth:`data_received` can be called an arbitrary number of times during
426a connection. However, :meth:`eof_received` is called at most once
427and, if called, :meth:`data_received` won't be called after it.
428
Victor Stinner54a231d2015-01-29 13:33:15 +0100429State machine:
430
431 start -> :meth:`~BaseProtocol.connection_made`
432 [-> :meth:`~Protocol.data_received` \*]
433 [-> :meth:`~Protocol.eof_received` ?]
434 -> :meth:`~BaseProtocol.connection_lost` -> end
435
436
Victor Stinnerea3183f2013-12-03 01:08:00 +0100437Datagram protocols
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100438------------------
Victor Stinnerea3183f2013-12-03 01:08:00 +0100439
440The following callbacks are called on :class:`DatagramProtocol` instances.
441
442.. method:: DatagramProtocol.datagram_received(data, addr)
443
444 Called when a datagram is received. *data* is a bytes object containing
445 the incoming data. *addr* is the address of the peer sending the data;
446 the exact format depends on the transport.
447
448.. method:: DatagramProtocol.error_received(exc)
449
450 Called when a previous send or receive operation raises an
451 :class:`OSError`. *exc* is the :class:`OSError` instance.
452
453 This method is called in rare conditions, when the transport (e.g. UDP)
454 detects that a datagram couldn't be delivered to its recipient.
455 In many conditions though, undeliverable datagrams will be silently
456 dropped.
457
458
459Flow control callbacks
460----------------------
461
Larry Hastings3732ed22014-03-15 21:13:56 -0700462These callbacks may be called on :class:`Protocol`,
463:class:`DatagramProtocol` and :class:`SubprocessProtocol` instances:
Victor Stinnerea3183f2013-12-03 01:08:00 +0100464
465.. method:: BaseProtocol.pause_writing()
466
467 Called when the transport's buffer goes over the high-water mark.
468
469.. method:: BaseProtocol.resume_writing()
470
471 Called when the transport's buffer drains below the low-water mark.
472
473
474:meth:`pause_writing` and :meth:`resume_writing` calls are paired --
475:meth:`pause_writing` is called once when the buffer goes strictly over
476the high-water mark (even if subsequent writes increases the buffer size
477even more), and eventually :meth:`resume_writing` is called once when the
478buffer size reaches the low-water mark.
479
480.. note::
481 If the buffer size equals the high-water mark,
482 :meth:`pause_writing` is not called -- it must go strictly over.
483 Conversely, :meth:`resume_writing` is called when the buffer size is
484 equal or lower than the low-water mark. These end conditions
485 are important to ensure that things go as expected when either
486 mark is zero.
487
Larry Hastings3732ed22014-03-15 21:13:56 -0700488.. note::
489 On BSD systems (OS X, FreeBSD, etc.) flow control is not supported
490 for :class:`DatagramProtocol`, because send failures caused by
491 writing too many packets cannot be detected easily. The socket
492 always appears 'ready' and excess packets are dropped; an
493 :class:`OSError` with errno set to :const:`errno.ENOBUFS` may or
494 may not be raised; if it is raised, it will be reported to
495 :meth:`DatagramProtocol.error_received` but otherwise ignored.
496
Victor Stinnerea3183f2013-12-03 01:08:00 +0100497
Victor Stinner4b4f9eb2014-01-24 17:33:20 +0100498Coroutines and protocols
499------------------------
500
Yury Selivanov04356e12015-06-30 22:13:22 -0400501Coroutines can be scheduled in a protocol method using :func:`ensure_future`,
502but there is no guarantee made about the execution order. Protocols are not
503aware of coroutines created in protocol methods and so will not wait for them.
Victor Stinner4b4f9eb2014-01-24 17:33:20 +0100504
Andrew Svetlov88743422017-12-11 17:35:49 +0200505To have a reliable execution order,
506use :ref:`stream objects <asyncio-streams>` in a
507coroutine with ``await``. For example, the :meth:`StreamWriter.drain`
Victor Stinner4b4f9eb2014-01-24 17:33:20 +0100508coroutine can be used to wait until the write buffer is flushed.
509
510
Victor Stinner04e6df32014-10-11 16:16:27 +0200511Protocol examples
512=================
Victor Stinnerea3183f2013-12-03 01:08:00 +0100513
Victor Stinnered051592014-10-12 20:18:16 +0200514.. _asyncio-tcp-echo-client-protocol:
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100515
Victor Stinnered051592014-10-12 20:18:16 +0200516TCP echo client protocol
517------------------------
518
Guido van Rossumf68afd82016-08-08 09:41:21 -0700519TCP echo client using the :meth:`AbstractEventLoop.create_connection` method, send
Victor Stinnered051592014-10-12 20:18:16 +0200520data and wait until the connection is closed::
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100521
522 import asyncio
523
Victor Stinnercfbea3a2014-10-12 11:30:17 +0200524 class EchoClientProtocol(asyncio.Protocol):
Victor Stinner53664342014-10-12 11:35:09 +0200525 def __init__(self, message, loop):
526 self.message = message
527 self.loop = loop
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100528
529 def connection_made(self, transport):
Victor Stinner31d83222013-12-04 11:16:17 +0100530 transport.write(self.message.encode())
Victor Stinner53664342014-10-12 11:35:09 +0200531 print('Data sent: {!r}'.format(self.message))
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100532
533 def data_received(self, data):
Victor Stinner53664342014-10-12 11:35:09 +0200534 print('Data received: {!r}'.format(data.decode()))
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100535
536 def connection_lost(self, exc):
Victor Stinner53664342014-10-12 11:35:09 +0200537 print('The server closed the connection')
Guido van Rossum41f69f42015-11-19 13:28:47 -0800538 print('Stop the event loop')
Victor Stinner53664342014-10-12 11:35:09 +0200539 self.loop.stop()
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100540
541 loop = asyncio.get_event_loop()
Victor Stinner53664342014-10-12 11:35:09 +0200542 message = 'Hello World!'
543 coro = loop.create_connection(lambda: EchoClientProtocol(message, loop),
544 '127.0.0.1', 8888)
Victor Stinnera881a7f2013-12-09 13:19:23 +0100545 loop.run_until_complete(coro)
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100546 loop.run_forever()
547 loop.close()
Victor Stinnerea3183f2013-12-03 01:08:00 +0100548
Victor Stinnera881a7f2013-12-09 13:19:23 +0100549The event loop is running twice. The
Guido van Rossumf68afd82016-08-08 09:41:21 -0700550:meth:`~AbstractEventLoop.run_until_complete` method is preferred in this short
Victor Stinnera881a7f2013-12-09 13:19:23 +0100551example to raise an exception if the server is not listening, instead of
552having to write a short coroutine to handle the exception and stop the
Guido van Rossumf68afd82016-08-08 09:41:21 -0700553running loop. At :meth:`~AbstractEventLoop.run_until_complete` exit, the loop is
Andrew Svetlov588517c2014-07-23 11:27:17 +0300554no longer running, so there is no need to stop the loop in case of an error.
Victor Stinnera881a7f2013-12-09 13:19:23 +0100555
Victor Stinnered051592014-10-12 20:18:16 +0200556.. seealso::
Victor Stinnerc2721b42014-10-12 11:13:40 +0200557
Victor Stinnered051592014-10-12 20:18:16 +0200558 The :ref:`TCP echo client using streams <asyncio-tcp-echo-client-streams>`
559 example uses the :func:`asyncio.open_connection` function.
Victor Stinnera881a7f2013-12-09 13:19:23 +0100560
Victor Stinnered051592014-10-12 20:18:16 +0200561
562.. _asyncio-tcp-echo-server-protocol:
563
564TCP echo server protocol
565------------------------
566
Guido van Rossumf68afd82016-08-08 09:41:21 -0700567TCP echo server using the :meth:`AbstractEventLoop.create_server` method, send back
Victor Stinnered051592014-10-12 20:18:16 +0200568received data and close the connection::
Victor Stinnera881a7f2013-12-09 13:19:23 +0100569
570 import asyncio
571
Victor Stinnercfbea3a2014-10-12 11:30:17 +0200572 class EchoServerClientProtocol(asyncio.Protocol):
Victor Stinnera881a7f2013-12-09 13:19:23 +0100573 def connection_made(self, transport):
574 peername = transport.get_extra_info('peername')
Victor Stinnerc2721b42014-10-12 11:13:40 +0200575 print('Connection from {}'.format(peername))
Victor Stinnera881a7f2013-12-09 13:19:23 +0100576 self.transport = transport
577
578 def data_received(self, data):
Victor Stinnerc2721b42014-10-12 11:13:40 +0200579 message = data.decode()
580 print('Data received: {!r}'.format(message))
581
582 print('Send: {!r}'.format(message))
Victor Stinnera881a7f2013-12-09 13:19:23 +0100583 self.transport.write(data)
584
Victor Stinner53664342014-10-12 11:35:09 +0200585 print('Close the client socket')
Victor Stinnera881a7f2013-12-09 13:19:23 +0100586 self.transport.close()
587
588 loop = asyncio.get_event_loop()
Victor Stinnercfbea3a2014-10-12 11:30:17 +0200589 # Each client connection will create a new protocol instance
590 coro = loop.create_server(EchoServerClientProtocol, '127.0.0.1', 8888)
Victor Stinnera881a7f2013-12-09 13:19:23 +0100591 server = loop.run_until_complete(coro)
Victor Stinnera881a7f2013-12-09 13:19:23 +0100592
Serhiy Storchaka0424eaf2015-09-12 17:45:25 +0300593 # Serve requests until Ctrl+C is pressed
Victor Stinnerc2721b42014-10-12 11:13:40 +0200594 print('Serving on {}'.format(server.sockets[0].getsockname()))
Victor Stinnera881a7f2013-12-09 13:19:23 +0100595 try:
596 loop.run_forever()
597 except KeyboardInterrupt:
Victor Stinnered051592014-10-12 20:18:16 +0200598 pass
Victor Stinnerc2721b42014-10-12 11:13:40 +0200599
600 # Close the server
601 server.close()
602 loop.run_until_complete(server.wait_closed())
603 loop.close()
Victor Stinnera881a7f2013-12-09 13:19:23 +0100604
R David Murray530a69f2013-12-14 11:26:06 -0500605:meth:`Transport.close` can be called immediately after
Victor Stinnera881a7f2013-12-09 13:19:23 +0100606:meth:`WriteTransport.write` even if data are not sent yet on the socket: both
Andrew Svetlov88743422017-12-11 17:35:49 +0200607methods are asynchronous. ``await`` is not needed because these transport
Larry Hastings3732ed22014-03-15 21:13:56 -0700608methods are not coroutines.
Victor Stinnera881a7f2013-12-09 13:19:23 +0100609
Victor Stinnered051592014-10-12 20:18:16 +0200610.. seealso::
611
612 The :ref:`TCP echo server using streams <asyncio-tcp-echo-server-streams>`
613 example uses the :func:`asyncio.start_server` function.
614
Victor Stinnerc7edffd2014-10-12 11:24:26 +0200615
616.. _asyncio-udp-echo-client-protocol:
617
618UDP echo client protocol
619------------------------
620
Guido van Rossumf68afd82016-08-08 09:41:21 -0700621UDP echo client using the :meth:`AbstractEventLoop.create_datagram_endpoint`
Victor Stinnerc7edffd2014-10-12 11:24:26 +0200622method, send data and close the transport when we received the answer::
623
624 import asyncio
625
626 class EchoClientProtocol:
627 def __init__(self, message, loop):
628 self.message = message
629 self.loop = loop
630 self.transport = None
631
632 def connection_made(self, transport):
633 self.transport = transport
634 print('Send:', self.message)
635 self.transport.sendto(self.message.encode())
636
637 def datagram_received(self, data, addr):
638 print("Received:", data.decode())
639
640 print("Close the socket")
641 self.transport.close()
642
643 def error_received(self, exc):
644 print('Error received:', exc)
645
646 def connection_lost(self, exc):
647 print("Socket closed, stop the event loop")
648 loop = asyncio.get_event_loop()
649 loop.stop()
650
651 loop = asyncio.get_event_loop()
652 message = "Hello World!"
653 connect = loop.create_datagram_endpoint(
654 lambda: EchoClientProtocol(message, loop),
655 remote_addr=('127.0.0.1', 9999))
656 transport, protocol = loop.run_until_complete(connect)
657 loop.run_forever()
658 transport.close()
659 loop.close()
660
661
662.. _asyncio-udp-echo-server-protocol:
663
664UDP echo server protocol
665------------------------
666
Guido van Rossumf68afd82016-08-08 09:41:21 -0700667UDP echo server using the :meth:`AbstractEventLoop.create_datagram_endpoint`
Victor Stinnerc7edffd2014-10-12 11:24:26 +0200668method, send back received data::
669
670 import asyncio
671
Victor Stinnercfbea3a2014-10-12 11:30:17 +0200672 class EchoServerProtocol:
Victor Stinnerc7edffd2014-10-12 11:24:26 +0200673 def connection_made(self, transport):
674 self.transport = transport
675
676 def datagram_received(self, data, addr):
677 message = data.decode()
678 print('Received %r from %s' % (message, addr))
679 print('Send %r to %s' % (message, addr))
680 self.transport.sendto(data, addr)
681
682 loop = asyncio.get_event_loop()
683 print("Starting UDP server")
Victor Stinnercfbea3a2014-10-12 11:30:17 +0200684 # One protocol instance will be created to serve all client requests
Victor Stinnerc7edffd2014-10-12 11:24:26 +0200685 listen = loop.create_datagram_endpoint(
Victor Stinnercfbea3a2014-10-12 11:30:17 +0200686 EchoServerProtocol, local_addr=('127.0.0.1', 9999))
Victor Stinnerc7edffd2014-10-12 11:24:26 +0200687 transport, protocol = loop.run_until_complete(listen)
688
689 try:
690 loop.run_forever()
691 except KeyboardInterrupt:
692 pass
693
694 transport.close()
695 loop.close()
696
697
Victor Stinner04e6df32014-10-11 16:16:27 +0200698.. _asyncio-register-socket:
Victor Stinnera881a7f2013-12-09 13:19:23 +0100699
Victor Stinner04e6df32014-10-11 16:16:27 +0200700Register an open socket to wait for data using a protocol
701---------------------------------------------------------
702
703Wait until a socket receives data using the
Guido van Rossumf68afd82016-08-08 09:41:21 -0700704:meth:`AbstractEventLoop.create_connection` method with a protocol, and then close
Victor Stinner04e6df32014-10-11 16:16:27 +0200705the event loop ::
706
707 import asyncio
Victor Stinnerac577d72017-11-28 21:33:20 +0100708 from socket import socketpair
Victor Stinner04e6df32014-10-11 16:16:27 +0200709
710 # Create a pair of connected sockets
Victor Stinnerccd8e342014-10-11 16:30:02 +0200711 rsock, wsock = socketpair()
Victor Stinner04e6df32014-10-11 16:16:27 +0200712 loop = asyncio.get_event_loop()
713
714 class MyProtocol(asyncio.Protocol):
715 transport = None
716
717 def connection_made(self, transport):
718 self.transport = transport
719
720 def data_received(self, data):
721 print("Received:", data.decode())
722
723 # We are done: close the transport (it will call connection_lost())
724 self.transport.close()
725
726 def connection_lost(self, exc):
727 # The socket has been closed, stop the event loop
728 loop.stop()
729
730 # Register the socket to wait for data
731 connect_coro = loop.create_connection(MyProtocol, sock=rsock)
732 transport, protocol = loop.run_until_complete(connect_coro)
733
734 # Simulate the reception of data from the network
735 loop.call_soon(wsock.send, 'abc'.encode())
736
737 # Run the event loop
738 loop.run_forever()
739
740 # We are done, close sockets and the event loop
741 rsock.close()
742 wsock.close()
743 loop.close()
744
745.. seealso::
746
747 The :ref:`watch a file descriptor for read events
748 <asyncio-watch-read-event>` example uses the low-level
Guido van Rossumf68afd82016-08-08 09:41:21 -0700749 :meth:`AbstractEventLoop.add_reader` method to register the file descriptor of a
Victor Stinner04e6df32014-10-11 16:16:27 +0200750 socket.
751
752 The :ref:`register an open socket to wait for data using streams
753 <asyncio-register-socket-streams>` example uses high-level streams
754 created by the :func:`open_connection` function in a coroutine.