отправка сообщения клиенту с использованием SocketServer в python

Я создаю TCP-сервер, используя модуль SocketServer в python.

Как мне кажется, функционал SocketServer.TCPServer предназначен для ответа клиенту, отправившему запрос на сервер, а не для случайного общения между сервером и клиентом. Например - Чат между сервером и клиентом..

Есть ли способ просто отправить сообщение какому-либо клиенту, зарегистрированному на сервере?

Мой код на данный момент:

import SocketServer
import chathandler
import threading

PORT = 12345

def do_main():
    global httpd

    Handler = chathandler.ChatHandler

    httpd = SocketServer.TCPServer(("", PORT), Handler)

    print "Serving at port:", PORT
    httpd.serve_forever()

if __name__ == '__main__':
    server_thread = threading.Thread(target = do_main)
    server_thread.start()

    while True:
        print "Send message to the clients"
        s = raw_input(": ")
        # TODO: Send the message!

В этом примере я хочу отправить сообщение всем клиентам, подключенным к серверу.

Благодарю вас!


person user3848844    schedule 11.10.2014    source источник
comment
Не могли бы вы объяснить, какой функционал вы планируете реализовать с помощью этой штуки.   -  person    schedule 11.10.2014
comment
Основное применение, которое я могу найти для этого, - это чат между двумя или более клиентами и сервером в качестве ретрансляционной станции. Когда он получает сообщение от одного клиента, он должен передать его всем остальным клиентам.   -  person user3848844    schedule 11.10.2014


Ответы (1)


Я решил эту проблему, используя постоянное соединение HTTP. Как можно процитировать из статьи:

Постоянное HTTP-соединение, также называемое HTTP keep-alive или повторное использование HTTP-соединения, представляет собой идею использования одного TCP-соединения для отправки и получения нескольких HTTP-запросов/ответов, в отличие от открытия нового соединения для каждой отдельной пары запрос/ответ.

Класс BaseHttpRequestHandler (от которого наследуется ChatHandler) имеет член с именем "protocol_version", который, как мы можем видеть в его документации:

Указывает версию протокола HTTP, используемую в ответах. Если установлено значение «HTTP/1.1», сервер будет разрешать постоянные соединения HTTP; однако ваш сервер должен затем включать точный заголовок Content-Length (используя send_header()) во все свои ответы клиентам. Для обратной совместимости по умолчанию установлено значение «HTTP/1.0».

поэтому, назначив Handler.protocol_version = 'HTTP/1.1', соединение не будет закрыто сразу после обработки одного запроса, а останется для обработки других запросов. Итак, последнее, что я сделал, это переопределил методы TCPServer get_request и close_request.

get_request вызывается для принятия соединения.

close_request вызывается для закрытия соединения.

В get_request я добавил команду после принятия соединения, чтобы добавить соединение в список всех текущих соединений, а в close_request я добавил команду для удаления этого соединения из того же список.

person user3848844    schedule 01.12.2014