{"id":47,"date":"2009-03-08T20:59:29","date_gmt":"2009-03-08T12:59:29","guid":{"rendered":"http:\/\/timyang.net\/?p=47"},"modified":"2009-03-08T21:15:04","modified_gmt":"2009-03-08T13:15:04","slug":"python-thread-socket-server","status":"publish","type":"post","link":"https:\/\/timyang.net\/python\/python-thread-socket-server\/","title":{"rendered":"Python thread socket server"},"content":{"rendered":"<p>\u4ece\u7f51\u4e0a\u53c2\u8003\u4e86\u4e00\u4e9b\u4ee3\u7801\uff0c\u5b9e\u73b0\u4e86\u4e00\u4e2aPython\u5b9e\u73b0\u7684\u57fa\u4e8e\u7ebf\u7a0b\u7684socket server, \u7528\u6765\u5b9e\u73b0\u5404\u79cd\u670d\u52a1\u7cfb\u7edf\u7684\u539f\u578b\u3002\u653e\u5728\u8fd9\u91cc\u4f9b\u4ee5\u540e\u53c2\u8003\u3002<\/p>\n<pre>#!\/usr\/bin\/env python\r\nimport threading\r\nimport SocketServer\r\n\r\nusers = []\r\n\r\nclass MyTCPHandler(SocketServer.StreamRequestHandler):\r\n    def handle(self):\r\n        username = None\r\n        while True:\r\n            self.data = self.rfile.readline().strip()\r\n            cur_thread = threading.currentThread()\r\n            print \"RECV from \", self.client_address[0]\r\n            cmd = self.data\r\n            if cmd == None or len(cmd) == 0:\r\n                break;\r\n            print cmd\r\n            # business logic here\r\n            try:\r\n                if cmd.startswith('echo'):\r\n                    result = cmd[5:]\r\n                elif cmd.startswith('login'):\r\n                    username = cmd[6:]\r\n                    users.append({username:self.wfile})\r\n                    result = username + ' logined.'\r\n                elif cmd == 'quit':\r\n                    break\r\n                else:\r\n                    result = 'error cmd'\r\n                self.wfile.write(result)\r\n                self.wfile.write('\\n')\r\n            except:\r\n                print 'error'\r\n                break\r\n        try:\r\n            if username != None:\r\n                users.remove(username)\r\n        except:\r\n            pass\r\n        print username, ' closed.'\r\n\r\nclass ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):\r\n    pass\r\n\r\nif __name__ == \"__main__\":\r\n    HOST, PORT = \"localhost\", 9999\r\n\r\n    server = ThreadedTCPServer((HOST, PORT), MyTCPHandler)\r\n    server_thread = threading.Thread(target=server.serve_forever)\r\n    server_thread.setDaemon(True)\r\n    server_thread.start()\r\n    server.serve_forever()<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4ece\u7f51\u4e0a\u53c2\u8003\u4e86\u4e00\u4e9b\u4ee3\u7801\uff0c\u5b9e\u73b0\u4e86\u4e00\u4e2aPython\u5b9e\u73b0\u7684\u57fa\u4e8e\u7ebf\u7a0b\u7684socket server, \u7528\u6765\u5b9e\u73b0\u5404\u79cd\u670d\u52a1\u7cfb\u7edf\u7684\u539f\u578b\u3002\u653e\u5728\u8fd9\u91cc\u4f9b\u4ee5\u540e\u53c2\u8003\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[157,16],"class_list":["post-47","post","type-post","status-publish","format-standard","hentry","category-python","tag-python","tag-socket"],"_links":{"self":[{"href":"https:\/\/timyang.net\/wp-json\/wp\/v2\/posts\/47","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/timyang.net\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/timyang.net\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/timyang.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/timyang.net\/wp-json\/wp\/v2\/comments?post=47"}],"version-history":[{"count":6,"href":"https:\/\/timyang.net\/wp-json\/wp\/v2\/posts\/47\/revisions"}],"predecessor-version":[{"id":51,"href":"https:\/\/timyang.net\/wp-json\/wp\/v2\/posts\/47\/revisions\/51"}],"wp:attachment":[{"href":"https:\/\/timyang.net\/wp-json\/wp\/v2\/media?parent=47"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/timyang.net\/wp-json\/wp\/v2\/categories?post=47"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/timyang.net\/wp-json\/wp\/v2\/tags?post=47"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}