if __name__ == '__main__':
#Порт 0 позволяет выбрать незанятый порт автоматически
HOST, PORT = "localhost", 0
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
# with server:
ip, port = server.server_address
#Запускаем поток для цикла сервера.
#Этот поток будет создавать поток для каждого клиента
server_thread = threading.Thread(target = server.serve_forever, name = 'thread.server')
#Ставим флаг daemon, чтобы сервер завершился, когда завершится основная программа
server_thread.daemon = True
server_thread.start()
print('Сервер запущен в потоке: {} по адресу {} : {}'.format(server_thread.name, ip, port))
client(ip, port, "Терминал-1 приветствует Вас!")
client(ip, port, "Терминал-2 ожидает соединения...")
client(ip, port, "Terminal-3 say you \"Hi!\"")
server.shutdown()
Нашел ответ в интернете: https://stackoverflow.com/questions/7447284/how-to...
Дело в том что инструкция with запрашивает объект с методами __enter__ и __exit__ , мой объект был объявлен без данных методов. Один из выходов - обойтись без синтаксического сахара на with. Убрал with и все заработало!!!