class_docstr: A non-blocking, single-threaded TCP server.
  
  To use `TCPServer`, define a subclass which overrides the `handle_stream`
  method. For example, a simple echo server could be defined like this::
  
    from tornado.tcpserver import TCPServer
    from tornado.iostream import StreamClosedError
  
    class EchoServer(TCPServer):
        async def handle_stream(self, stream, address):
            while True:
                try:
                    data = await stream.read_until(b"\n") await
                    stream.write(data)
                except StreamClosedError:
                    break
  
  To make this server serve SSL traffic, send the ``ssl_options`` keyword
  argument with an `ssl.SSLContext` object. For compatibility with older
  versions of Python ``ssl_options`` may also be a dictionary of keyword
  arguments for the `ssl.SSLContext.wrap_socket` method.::
  
     ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
     ssl_ctx.load_cert_chain(os.path.join(data_dir, "mydomain.crt"),
                             os.path.join(data_dir, "mydomain.key"))
     TCPServer(ssl_options=ssl_ctx)
  
  `TCPServer` initialization follows one of three patterns:
  
  1. `listen`: single-process::
  
          async def main():
              server = TCPServer()
              server.listen(8888)
              await asyncio.Event.wait()
  
          asyncio.run(main())
  
     While this example does not create multiple processes on its own, when
     the ``reuse_port=True`` argument is passed to ``listen()`` you can run
     the program multiple times to create a multi-process service.
  
  2. `add_sockets`: multi-process::
  
          sockets = bind_sockets(8888)
          tornado.process.fork_processes(0)
          async def post_fork_main():
              server = TCPServer()
              server.add_sockets(sockets)
              await asyncio.Event().wait()
          asyncio.run(post_fork_main())
  
     The `add_sockets` interface is more complicated, but it can be used with
     `tornado.process.fork_processes` to run a multi-process service with all
     worker processes forked from a single parent.  `add_sockets` can also be
     used in single-process servers if you want to create your listening
     sockets in some way other than `~tornado.netutil.bind_sockets`.
  
     Note that when using this pattern, nothing that touches the event loop
     can be run before ``fork_processes``.
  
  3. `bind`/`start`: simple **deprecated** multi-process::
  
          server = TCPServer()
          server.bind(8888)
          server.start(0)  # Forks multiple sub-processes
          IOLoop.current().start()
  
     This pattern is deprecated because it requires interfaces in the
     `asyncio` module that have been deprecated since Python 3.10. Support for
     creating multiple processes in the ``start`` method will be removed in a
     future version of Tornado.
  
  .. versionadded:: 3.1
     The ``max_buffer_size`` argument.
  
  .. versionchanged:: 5.0
     The ``io_loop`` argument has been removed.
class_docstr_tok: ["A","non-blocking",",","single-threaded","TCP","server",".","To","use","`","TCPServer","`",",","define","a","subclass","which","overrides","the","`","handle_stream","`","method",".","For","example",",","a","simple","echo","server","could","be","defined","like","this",":",":","from","tornado.tcpserver","import","TCPServer","from","tornado.iostream","import","StreamClosedError","class","EchoServer","(","TCPServer",")",":","async","def","handle_stream","(","self",",","stream",",","address",")",":","while","True",":","try",":","data","=","await","stream.read_until","(","b","''","\\n","''",")","await","stream.write","(","data",")","except","StreamClosedError",":","break","To","make","this","server","serve","SSL","traffic",",","send","the","``","ssl_options","``","keyword","argument","with","an","`","ssl.SSLContext","`","object",".","For","compatibility","with","older","versions","of","Python","``","ssl_options","``","may","also","be","a","dictionary","of","keyword","arguments","for","the","`","ssl.SSLContext.wrap_socket","`","method",".",":",":","ssl_ctx","=","ssl.create_default_context","(","ssl.Purpose.CLIENT_AUTH",")","ssl_ctx.load_cert_chain","(","os.path.join","(","data_dir",",","``","mydomain.crt","''",")",",","os.path.join","(","data_dir",",","``","mydomain.key","''",")",")","TCPServer","(","ssl_options=ssl_ctx",")","`","TCPServer","`","initialization","follows","one","of","three","patterns",":","1",".","`","listen","`",":","single-process",":",":","async","def","main","(",")",":","server","=","TCPServer","(",")","server.listen","(","8888",")","await","asyncio.Event.wait","(",")","asyncio.run","(","main","(",")",")","While","this","example","does","not","create","multiple","processes","on","its","own",",","when","the","``","reuse_port=True","``","argument","is","passed","to","``","listen","(",")","``","you","can","run","the","program","multiple","times","to","create","a","multi-process","service",".","2",".","`","add_sockets","`",":","multi-process",":",":","sockets","=","bind_sockets","(","8888",")","tornado.process.fork_processes","(","0",")","async","def","post_fork_main","(",")",":","server","=","TCPServer","(",")","server.add_sockets","(","sockets",")","await","asyncio.Event","(",")",".wait","(",")","asyncio.run","(","post_fork_main","(",")",")","The","`","add_sockets","`","interface","is","more","complicated",",","but","it","can","be","used","with","`","tornado.process.fork_processes","`","to","run","a","multi-process","service","with","all","worker","processes","forked","from","a","single","parent",".","`","add_sockets","`","can","also","be","used","in","single-process","servers","if","you","want","to","create","your","listening","sockets","in","some","way","other","than","`","~tornado.netutil.bind_sockets","`",".","Note","that","when","using","this","pattern",",","nothing","that","touches","the","event","loop","can","be","run","before","``","fork_processes","``",".","3",".","`","bind","`","\/","`","start","`",":","simple","*","*","deprecated","*","*","multi-process",":",":","server","=","TCPServer","(",")","server.bind","(","8888",")","server.start","(","0",")","#","Forks","multiple","sub-processes","IOLoop.current","(",")",".start","(",")","This","pattern","is","deprecated","because","it","requires","interfaces","in","the","`","asyncio","`","module","that","have","been","deprecated","since","Python","3.10",".","Support","for","creating","multiple","processes","in","the","``","start","``","method","will","be","removed","in","a","future","version","of","Tornado",".","..","versionadded",":",":","3.1","The","``","max_buffer_size","``","argument",".","..","versionchanged",":",":","5.0","The","``","io_loop","``","argument","has","been","removed","."]
docstr: Makes this server start accepting connections on the given sockets.
  
  The ``sockets`` parameter is a list of socket objects such as
  those returned by `~tornado.netutil.bind_sockets`.
  `add_sockets` is typically used in combination with that
  method and `tornado.process.fork_processes` to provide greater
  control over the initialization of a multi-process server.
docstr_tok: ["Makes","this","server","start","accepting","connections","on","the","given","sockets",".","The","``","sockets","``","parameter","is","a","list","of","socket","objects","such","as","those","returned","by","`","~tornado.netutil.bind_sockets","`",".","`","add_sockets","`","is","typically","used","in","combination","with","that","method","and","`","tornado.process.fork_processes","`","to","provide","greater","control","over","the","initialization","of","a","multi-process","server","."]
code: def add_sockets(self, sockets: Iterable[socket.socket]) -> None:
      """Makes this server start accepting connections on the given sockets.
  
      The ``sockets`` parameter is a list of socket objects such as
      those returned by `~tornado.netutil.bind_sockets`.
      `add_sockets` is typically used in combination with that
      method and `tornado.process.fork_processes` to provide greater
      control over the initialization of a multi-process server.
      """
      for sock in sockets:
          self._sockets[sock.fileno()] = sock
          self._handlers[sock.fileno()] = add_accept_handler(
              sock, self._handle_connection
          )
  
imports: import errno
  import os
  import socket
  import ssl
  from tornado import gen
  from tornado.log import app_log
  from tornado.ioloop import IOLoop
  from tornado.iostream import IOStream, SSLIOStream
  from tornado.netutil import bind_sockets, add_accept_handler, ssl_wrap_socket, _DEFAULT_BACKLOG
  from tornado import process
  from tornado.util import errno_from_exception
  import typing
  from typing import Union, Dict, Any, Iterable, Optional, Awaitable
label_desc: Use image node_id 3 for calling the TCPServer obj's underlying member method code with example usage: obj.add_sockets(sockets) without return types