在python中使用SocketServer向客户端发送消息

时间:2014-10-11 13:58:30

标签: python network-programming socketserver

我在python中使用SocketServer模块构建TCP服务器。

在我看来,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!

在此示例中,我想将消息发送给连接到服务器的所有客户端。

谢谢!

1 个答案:

答案 0 :(得分:0)

我解决这个问题的方法是使用HTTP persistent connection。 可以从文章中引用:

  

HTTP持久连接,也称为HTTP keep-alive或HTTP   连接重用,是使用单个TCP连接发送的想法   并且接收多个HTTP请求/响应,而不是打开一个   每个请求/响应对的新连接。

BaseHttpRequestHandler 类(ChatHandler继承自的类)有一个名为" protocol_version "的成员。正如我们在其文档中看到的那样:

  

指定响应中使用的HTTP协议版本。如果设置为   ' HTTP / 1.1',服务器将允许HTTP持久连接;   但是,您的服务器必须包含准确的Content-Length   header(使用send_header())在其对客户端的所有响应中。对于   向后兼容性,设置默认为' HTTP / 1.0'。

因此,通过分配Handler.protocol_version =' HTTP / 1.1',连接在处理完一个请求后不会立即关闭,但也将继续处理其他请求。所以我做的最后一件事是覆盖TCPServer的 get_request close_request 方法。

调用

get_request 来接受连接。

调用

close_request 来关闭连接。

get_request 中,我在接受连接后添加了一个命令,将连接添加到所有当前连接的列表中,并在 close_request 中添加了一个命令来删除此连接来自同一个名单。