blob: ef6441605cd72c2f4aa11b41289f559fad165221 [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
Yury Selivanov631fd382018-01-28 16:30:26 -0500336.. class:: BufferedProtocol
337
338 A base class for implementing streaming protocols with manual
339 control of the receive buffer.
340
341 .. versionadded:: 3.7
Serhiy Storchakabac2d5b2018-03-28 22:14:26 +0300342 **Important:** this has been added to asyncio in Python 3.7
Yury Selivanov631fd382018-01-28 16:30:26 -0500343 *on a provisional basis*! Treat it as an experimental API that
344 might be changed or removed in Python 3.8.
345
Victor Stinnerea3183f2013-12-03 01:08:00 +0100346.. class:: DatagramProtocol
347
348 The base class for implementing datagram protocols (for use with
349 e.g. UDP transports).
350
351.. class:: SubprocessProtocol
352
353 The base class for implementing protocols communicating with child
354 processes (through a set of unidirectional pipes).
355
356
357Connection callbacks
358--------------------
359
Victor Stinner15386652014-06-10 09:19:26 +0200360These callbacks may be called on :class:`Protocol`, :class:`DatagramProtocol`
361and :class:`SubprocessProtocol` instances:
Victor Stinnerea3183f2013-12-03 01:08:00 +0100362
363.. method:: BaseProtocol.connection_made(transport)
364
365 Called when a connection is made.
366
367 The *transport* argument is the transport representing the
368 connection. You are responsible for storing it somewhere
369 (e.g. as an attribute) if you need to.
370
371.. method:: BaseProtocol.connection_lost(exc)
372
373 Called when the connection is lost or closed.
374
375 The argument is either an exception object or :const:`None`.
376 The latter means a regular EOF is received, or the connection was
377 aborted or closed by this side of the connection.
378
Victor Stinner15386652014-06-10 09:19:26 +0200379:meth:`~BaseProtocol.connection_made` and :meth:`~BaseProtocol.connection_lost`
380are called exactly once per successful connection. All other callbacks will be
381called between those two methods, which allows for easier resource management
382in your protocol implementation.
Victor Stinnerea3183f2013-12-03 01:08:00 +0100383
384The following callbacks may be called only on :class:`SubprocessProtocol`
385instances:
386
387.. method:: SubprocessProtocol.pipe_data_received(fd, data)
388
389 Called when the child process writes data into its stdout or stderr pipe.
390 *fd* is the integer file descriptor of the pipe. *data* is a non-empty
391 bytes object containing the data.
392
393.. method:: SubprocessProtocol.pipe_connection_lost(fd, exc)
394
395 Called when one of the pipes communicating with the child process
396 is closed. *fd* is the integer file descriptor that was closed.
397
398.. method:: SubprocessProtocol.process_exited()
399
400 Called when the child process has exited.
401
402
Victor Stinnerea3183f2013-12-03 01:08:00 +0100403Streaming protocols
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100404-------------------
Victor Stinnerea3183f2013-12-03 01:08:00 +0100405
406The following callbacks are called on :class:`Protocol` instances:
407
408.. method:: Protocol.data_received(data)
409
410 Called when some data is received. *data* is a non-empty bytes object
411 containing the incoming data.
412
413 .. note::
414 Whether the data is buffered, chunked or reassembled depends on
415 the transport. In general, you shouldn't rely on specific semantics
416 and instead make your parsing generic and flexible enough. However,
417 data is always received in the correct order.
418
419.. method:: Protocol.eof_received()
420
Barry Warsawdd9a0a12017-04-07 14:18:14 -0400421 Called when the other end signals it won't send any more data
Victor Stinnerea3183f2013-12-03 01:08:00 +0100422 (for example by calling :meth:`write_eof`, if the other end also uses
423 asyncio).
424
Serhiy Storchakaecf41da2016-10-19 16:29:26 +0300425 This method may return a false value (including ``None``), in which case
Victor Stinnerea3183f2013-12-03 01:08:00 +0100426 the transport will close itself. Conversely, if this method returns a
427 true value, closing the transport is up to the protocol. Since the
Serhiy Storchakaecf41da2016-10-19 16:29:26 +0300428 default implementation returns ``None``, it implicitly closes the connection.
Victor Stinnerea3183f2013-12-03 01:08:00 +0100429
430 .. note::
431 Some transports such as SSL don't support half-closed connections,
432 in which case returning true from this method will not prevent closing
433 the connection.
434
435:meth:`data_received` can be called an arbitrary number of times during
436a connection. However, :meth:`eof_received` is called at most once
437and, if called, :meth:`data_received` won't be called after it.
438
Victor Stinner54a231d2015-01-29 13:33:15 +0100439State machine:
440
Yury Selivanov631fd382018-01-28 16:30:26 -0500441.. code-block:: none
442
443 start -> connection_made
444 [-> data_received]*
445 [-> eof_received]?
446 -> connection_lost -> end
447
448
449Streaming protocols with manual receive buffer control
450------------------------------------------------------
451
452.. versionadded:: 3.7
Serhiy Storchakabac2d5b2018-03-28 22:14:26 +0300453 **Important:** :class:`BufferedProtocol` has been added to
Yury Selivanov07627e92018-01-28 23:51:08 -0500454 asyncio in Python 3.7 *on a provisional basis*! Consider it as an
Yury Selivanov631fd382018-01-28 16:30:26 -0500455 experimental API that might be changed or removed in Python 3.8.
456
457
458Event methods, such as :meth:`AbstractEventLoop.create_server` and
459:meth:`AbstractEventLoop.create_connection`, accept factories that
460return protocols that implement this interface.
461
462The idea of BufferedProtocol is that it allows to manually allocate
463and control the receive buffer. Event loops can then use the buffer
464provided by the protocol to avoid unnecessary data copies. This
465can result in noticeable performance improvement for protocols that
466receive big amounts of data. Sophisticated protocols can allocate
467the buffer only once at creation time.
468
469The following callbacks are called on :class:`BufferedProtocol`
470instances:
471
472.. method:: BufferedProtocol.get_buffer()
473
474 Called to allocate a new receive buffer. Must return an object
475 that implements the :ref:`buffer protocol <bufferobjects>`.
476
477.. method:: BufferedProtocol.buffer_updated(nbytes)
478
479 Called when the buffer was updated with the received data.
480
481 *nbytes* is the total number of bytes that were written to the buffer.
482
483.. method:: BufferedProtocol.eof_received()
484
485 See the documentation of the :meth:`Protocol.eof_received` method.
486
487
488:meth:`get_buffer` can be called an arbitrary number of times during
489a connection. However, :meth:`eof_received` is called at most once
Yury Selivanov07627e92018-01-28 23:51:08 -0500490and, if called, :meth:`get_buffer` and :meth:`buffer_updated`
491won't be called after it.
Yury Selivanov631fd382018-01-28 16:30:26 -0500492
493State machine:
494
495.. code-block:: none
496
497 start -> connection_made
498 [-> get_buffer
499 [-> buffer_updated]?
500 ]*
501 [-> eof_received]?
502 -> connection_lost -> end
Victor Stinner54a231d2015-01-29 13:33:15 +0100503
504
Victor Stinnerea3183f2013-12-03 01:08:00 +0100505Datagram protocols
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100506------------------
Victor Stinnerea3183f2013-12-03 01:08:00 +0100507
508The following callbacks are called on :class:`DatagramProtocol` instances.
509
510.. method:: DatagramProtocol.datagram_received(data, addr)
511
512 Called when a datagram is received. *data* is a bytes object containing
513 the incoming data. *addr* is the address of the peer sending the data;
514 the exact format depends on the transport.
515
516.. method:: DatagramProtocol.error_received(exc)
517
518 Called when a previous send or receive operation raises an
519 :class:`OSError`. *exc* is the :class:`OSError` instance.
520
521 This method is called in rare conditions, when the transport (e.g. UDP)
522 detects that a datagram couldn't be delivered to its recipient.
523 In many conditions though, undeliverable datagrams will be silently
524 dropped.
525
526
527Flow control callbacks
528----------------------
529
Larry Hastings3732ed22014-03-15 21:13:56 -0700530These callbacks may be called on :class:`Protocol`,
531:class:`DatagramProtocol` and :class:`SubprocessProtocol` instances:
Victor Stinnerea3183f2013-12-03 01:08:00 +0100532
533.. method:: BaseProtocol.pause_writing()
534
535 Called when the transport's buffer goes over the high-water mark.
536
537.. method:: BaseProtocol.resume_writing()
538
539 Called when the transport's buffer drains below the low-water mark.
540
541
542:meth:`pause_writing` and :meth:`resume_writing` calls are paired --
543:meth:`pause_writing` is called once when the buffer goes strictly over
544the high-water mark (even if subsequent writes increases the buffer size
545even more), and eventually :meth:`resume_writing` is called once when the
546buffer size reaches the low-water mark.
547
548.. note::
549 If the buffer size equals the high-water mark,
550 :meth:`pause_writing` is not called -- it must go strictly over.
551 Conversely, :meth:`resume_writing` is called when the buffer size is
552 equal or lower than the low-water mark. These end conditions
553 are important to ensure that things go as expected when either
554 mark is zero.
555
Larry Hastings3732ed22014-03-15 21:13:56 -0700556.. note::
557 On BSD systems (OS X, FreeBSD, etc.) flow control is not supported
558 for :class:`DatagramProtocol`, because send failures caused by
559 writing too many packets cannot be detected easily. The socket
560 always appears 'ready' and excess packets are dropped; an
561 :class:`OSError` with errno set to :const:`errno.ENOBUFS` may or
562 may not be raised; if it is raised, it will be reported to
563 :meth:`DatagramProtocol.error_received` but otherwise ignored.
564
Victor Stinnerea3183f2013-12-03 01:08:00 +0100565
Victor Stinner4b4f9eb2014-01-24 17:33:20 +0100566Coroutines and protocols
567------------------------
568
Yury Selivanov04356e12015-06-30 22:13:22 -0400569Coroutines can be scheduled in a protocol method using :func:`ensure_future`,
570but there is no guarantee made about the execution order. Protocols are not
571aware of coroutines created in protocol methods and so will not wait for them.
Victor Stinner4b4f9eb2014-01-24 17:33:20 +0100572
Andrew Svetlov88743422017-12-11 17:35:49 +0200573To have a reliable execution order,
574use :ref:`stream objects <asyncio-streams>` in a
575coroutine with ``await``. For example, the :meth:`StreamWriter.drain`
Victor Stinner4b4f9eb2014-01-24 17:33:20 +0100576coroutine can be used to wait until the write buffer is flushed.
577
578
Victor Stinner04e6df32014-10-11 16:16:27 +0200579Protocol examples
580=================
Victor Stinnerea3183f2013-12-03 01:08:00 +0100581
Victor Stinnered051592014-10-12 20:18:16 +0200582.. _asyncio-tcp-echo-client-protocol:
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100583
Victor Stinnered051592014-10-12 20:18:16 +0200584TCP echo client protocol
585------------------------
586
Guido van Rossumf68afd82016-08-08 09:41:21 -0700587TCP echo client using the :meth:`AbstractEventLoop.create_connection` method, send
Victor Stinnered051592014-10-12 20:18:16 +0200588data and wait until the connection is closed::
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100589
590 import asyncio
591
Victor Stinnercfbea3a2014-10-12 11:30:17 +0200592 class EchoClientProtocol(asyncio.Protocol):
Victor Stinner53664342014-10-12 11:35:09 +0200593 def __init__(self, message, loop):
594 self.message = message
595 self.loop = loop
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100596
597 def connection_made(self, transport):
Victor Stinner31d83222013-12-04 11:16:17 +0100598 transport.write(self.message.encode())
Victor Stinner53664342014-10-12 11:35:09 +0200599 print('Data sent: {!r}'.format(self.message))
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100600
601 def data_received(self, data):
Victor Stinner53664342014-10-12 11:35:09 +0200602 print('Data received: {!r}'.format(data.decode()))
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100603
604 def connection_lost(self, exc):
Victor Stinner53664342014-10-12 11:35:09 +0200605 print('The server closed the connection')
Guido van Rossum41f69f42015-11-19 13:28:47 -0800606 print('Stop the event loop')
Victor Stinner53664342014-10-12 11:35:09 +0200607 self.loop.stop()
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100608
609 loop = asyncio.get_event_loop()
Victor Stinner53664342014-10-12 11:35:09 +0200610 message = 'Hello World!'
611 coro = loop.create_connection(lambda: EchoClientProtocol(message, loop),
612 '127.0.0.1', 8888)
Victor Stinnera881a7f2013-12-09 13:19:23 +0100613 loop.run_until_complete(coro)
Victor Stinner0c6f1ca2013-12-03 01:46:39 +0100614 loop.run_forever()
615 loop.close()
Victor Stinnerea3183f2013-12-03 01:08:00 +0100616
Victor Stinnera881a7f2013-12-09 13:19:23 +0100617The event loop is running twice. The
Guido van Rossumf68afd82016-08-08 09:41:21 -0700618:meth:`~AbstractEventLoop.run_until_complete` method is preferred in this short
Victor Stinnera881a7f2013-12-09 13:19:23 +0100619example to raise an exception if the server is not listening, instead of
620having to write a short coroutine to handle the exception and stop the
Guido van Rossumf68afd82016-08-08 09:41:21 -0700621running loop. At :meth:`~AbstractEventLoop.run_until_complete` exit, the loop is
Andrew Svetlov588517c2014-07-23 11:27:17 +0300622no longer running, so there is no need to stop the loop in case of an error.
Victor Stinnera881a7f2013-12-09 13:19:23 +0100623
Victor Stinnered051592014-10-12 20:18:16 +0200624.. seealso::
Victor Stinnerc2721b42014-10-12 11:13:40 +0200625
Victor Stinnered051592014-10-12 20:18:16 +0200626 The :ref:`TCP echo client using streams <asyncio-tcp-echo-client-streams>`
627 example uses the :func:`asyncio.open_connection` function.
Victor Stinnera881a7f2013-12-09 13:19:23 +0100628
Victor Stinnered051592014-10-12 20:18:16 +0200629
630.. _asyncio-tcp-echo-server-protocol:
631
632TCP echo server protocol
633------------------------
634
Guido van Rossumf68afd82016-08-08 09:41:21 -0700635TCP echo server using the :meth:`AbstractEventLoop.create_server` method, send back
Victor Stinnered051592014-10-12 20:18:16 +0200636received data and close the connection::
Victor Stinnera881a7f2013-12-09 13:19:23 +0100637
638 import asyncio
639
Victor Stinnercfbea3a2014-10-12 11:30:17 +0200640 class EchoServerClientProtocol(asyncio.Protocol):
Victor Stinnera881a7f2013-12-09 13:19:23 +0100641 def connection_made(self, transport):
642 peername = transport.get_extra_info('peername')
Victor Stinnerc2721b42014-10-12 11:13:40 +0200643 print('Connection from {}'.format(peername))
Victor Stinnera881a7f2013-12-09 13:19:23 +0100644 self.transport = transport
645
646 def data_received(self, data):
Victor Stinnerc2721b42014-10-12 11:13:40 +0200647 message = data.decode()
648 print('Data received: {!r}'.format(message))
649
650 print('Send: {!r}'.format(message))
Victor Stinnera881a7f2013-12-09 13:19:23 +0100651 self.transport.write(data)
652
Victor Stinner53664342014-10-12 11:35:09 +0200653 print('Close the client socket')
Victor Stinnera881a7f2013-12-09 13:19:23 +0100654 self.transport.close()
655
656 loop = asyncio.get_event_loop()
Victor Stinnercfbea3a2014-10-12 11:30:17 +0200657 # Each client connection will create a new protocol instance
658 coro = loop.create_server(EchoServerClientProtocol, '127.0.0.1', 8888)
Victor Stinnera881a7f2013-12-09 13:19:23 +0100659 server = loop.run_until_complete(coro)
Victor Stinnera881a7f2013-12-09 13:19:23 +0100660
Serhiy Storchaka0424eaf2015-09-12 17:45:25 +0300661 # Serve requests until Ctrl+C is pressed
Victor Stinnerc2721b42014-10-12 11:13:40 +0200662 print('Serving on {}'.format(server.sockets[0].getsockname()))
Victor Stinnera881a7f2013-12-09 13:19:23 +0100663 try:
664 loop.run_forever()
665 except KeyboardInterrupt:
Victor Stinnered051592014-10-12 20:18:16 +0200666 pass
Victor Stinnerc2721b42014-10-12 11:13:40 +0200667
668 # Close the server
669 server.close()
670 loop.run_until_complete(server.wait_closed())
671 loop.close()
Victor Stinnera881a7f2013-12-09 13:19:23 +0100672
R David Murray530a69f2013-12-14 11:26:06 -0500673:meth:`Transport.close` can be called immediately after
Victor Stinnera881a7f2013-12-09 13:19:23 +0100674:meth:`WriteTransport.write` even if data are not sent yet on the socket: both
Andrew Svetlov88743422017-12-11 17:35:49 +0200675methods are asynchronous. ``await`` is not needed because these transport
Larry Hastings3732ed22014-03-15 21:13:56 -0700676methods are not coroutines.
Victor Stinnera881a7f2013-12-09 13:19:23 +0100677
Victor Stinnered051592014-10-12 20:18:16 +0200678.. seealso::
679
680 The :ref:`TCP echo server using streams <asyncio-tcp-echo-server-streams>`
681 example uses the :func:`asyncio.start_server` function.
682
Victor Stinnerc7edffd2014-10-12 11:24:26 +0200683
684.. _asyncio-udp-echo-client-protocol:
685
686UDP echo client protocol
687------------------------
688
Guido van Rossumf68afd82016-08-08 09:41:21 -0700689UDP echo client using the :meth:`AbstractEventLoop.create_datagram_endpoint`
Victor Stinnerc7edffd2014-10-12 11:24:26 +0200690method, send data and close the transport when we received the answer::
691
692 import asyncio
693
694 class EchoClientProtocol:
695 def __init__(self, message, loop):
696 self.message = message
697 self.loop = loop
698 self.transport = None
699
700 def connection_made(self, transport):
701 self.transport = transport
702 print('Send:', self.message)
703 self.transport.sendto(self.message.encode())
704
705 def datagram_received(self, data, addr):
706 print("Received:", data.decode())
707
708 print("Close the socket")
709 self.transport.close()
710
711 def error_received(self, exc):
712 print('Error received:', exc)
713
714 def connection_lost(self, exc):
715 print("Socket closed, stop the event loop")
716 loop = asyncio.get_event_loop()
717 loop.stop()
718
719 loop = asyncio.get_event_loop()
720 message = "Hello World!"
721 connect = loop.create_datagram_endpoint(
722 lambda: EchoClientProtocol(message, loop),
723 remote_addr=('127.0.0.1', 9999))
724 transport, protocol = loop.run_until_complete(connect)
725 loop.run_forever()
726 transport.close()
727 loop.close()
728
729
730.. _asyncio-udp-echo-server-protocol:
731
732UDP echo server protocol
733------------------------
734
Guido van Rossumf68afd82016-08-08 09:41:21 -0700735UDP echo server using the :meth:`AbstractEventLoop.create_datagram_endpoint`
Victor Stinnerc7edffd2014-10-12 11:24:26 +0200736method, send back received data::
737
738 import asyncio
739
Victor Stinnercfbea3a2014-10-12 11:30:17 +0200740 class EchoServerProtocol:
Victor Stinnerc7edffd2014-10-12 11:24:26 +0200741 def connection_made(self, transport):
742 self.transport = transport
743
744 def datagram_received(self, data, addr):
745 message = data.decode()
746 print('Received %r from %s' % (message, addr))
747 print('Send %r to %s' % (message, addr))
748 self.transport.sendto(data, addr)
749
750 loop = asyncio.get_event_loop()
751 print("Starting UDP server")
Victor Stinnercfbea3a2014-10-12 11:30:17 +0200752 # One protocol instance will be created to serve all client requests
Victor Stinnerc7edffd2014-10-12 11:24:26 +0200753 listen = loop.create_datagram_endpoint(
Victor Stinnercfbea3a2014-10-12 11:30:17 +0200754 EchoServerProtocol, local_addr=('127.0.0.1', 9999))
Victor Stinnerc7edffd2014-10-12 11:24:26 +0200755 transport, protocol = loop.run_until_complete(listen)
756
757 try:
758 loop.run_forever()
759 except KeyboardInterrupt:
760 pass
761
762 transport.close()
763 loop.close()
764
765
Victor Stinner04e6df32014-10-11 16:16:27 +0200766.. _asyncio-register-socket:
Victor Stinnera881a7f2013-12-09 13:19:23 +0100767
Victor Stinner04e6df32014-10-11 16:16:27 +0200768Register an open socket to wait for data using a protocol
769---------------------------------------------------------
770
771Wait until a socket receives data using the
Guido van Rossumf68afd82016-08-08 09:41:21 -0700772:meth:`AbstractEventLoop.create_connection` method with a protocol, and then close
Victor Stinner04e6df32014-10-11 16:16:27 +0200773the event loop ::
774
775 import asyncio
Victor Stinnerac577d72017-11-28 21:33:20 +0100776 from socket import socketpair
Victor Stinner04e6df32014-10-11 16:16:27 +0200777
778 # Create a pair of connected sockets
Victor Stinnerccd8e342014-10-11 16:30:02 +0200779 rsock, wsock = socketpair()
Victor Stinner04e6df32014-10-11 16:16:27 +0200780 loop = asyncio.get_event_loop()
781
782 class MyProtocol(asyncio.Protocol):
783 transport = None
784
785 def connection_made(self, transport):
786 self.transport = transport
787
788 def data_received(self, data):
789 print("Received:", data.decode())
790
791 # We are done: close the transport (it will call connection_lost())
792 self.transport.close()
793
794 def connection_lost(self, exc):
795 # The socket has been closed, stop the event loop
796 loop.stop()
797
798 # Register the socket to wait for data
799 connect_coro = loop.create_connection(MyProtocol, sock=rsock)
800 transport, protocol = loop.run_until_complete(connect_coro)
801
802 # Simulate the reception of data from the network
803 loop.call_soon(wsock.send, 'abc'.encode())
804
805 # Run the event loop
806 loop.run_forever()
807
808 # We are done, close sockets and the event loop
809 rsock.close()
810 wsock.close()
811 loop.close()
812
813.. seealso::
814
815 The :ref:`watch a file descriptor for read events
816 <asyncio-watch-read-event>` example uses the low-level
Guido van Rossumf68afd82016-08-08 09:41:21 -0700817 :meth:`AbstractEventLoop.add_reader` method to register the file descriptor of a
Victor Stinner04e6df32014-10-11 16:16:27 +0200818 socket.
819
820 The :ref:`register an open socket to wait for data using streams
821 <asyncio-register-socket-streams>` example uses high-level streams
822 created by the :func:`open_connection` function in a coroutine.