我在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!
在此示例中,我想将消息发送给连接到服务器的所有客户端。
谢谢!
答案 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 中添加了一个命令来删除此连接来自同一个名单。