愉快的搞基,利用Python打造上万并发的聊天室

工具:Pycharm
环境:Python2.7+tornado+图灵机器人

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
import os
import datetime
import requests
import json
from tornado.web import RequestHandler
from tornado.options import define, options
from tornado.websocket import WebSocketHandler

define("port", default=8033, type=int)


class IndexHandler(RequestHandler):

    def get(self):
        self.render("index.html")


class ChatHandler(WebSocketHandler):
    users = set()  # 用来存放在线用户的容器

    def open(self):
        self.users.add(self)  # 建立连接后添加用户到容器中
        id = self.get_argument('id', 'nil')
        self.userid = id
        self.hasToken = False
        print("id:" + self.userid)
        for u in self.users:  # 向已在线用户发送消息
            u.write_message(u"请输入口令进入聊天室")

    def on_message(self, message):
        # test_push_data2()
        # getResponse2(message)
        for u in self.users:  # 向在线用户广播消息
            if u.hasToken:
                newMessage = getResponse2(message)
                # print("type"+newMessage )
                text = newMessage['text']
                print (text)
                u.write_message(u"[%s]-[%s]-说:%s" % (
                    self.request.remote_ip, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), text))
            else:
                if cmp(message, u"1") == 0:
                    u.hasToken = True
                    u.write_message(
                        u"[%s]-[%s]-进入聊天室" % (
                            self.request.remote_ip, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
                else:
                    u.write_message(u"服务器拒绝了你的访问并向你问好")

    def on_close(self):
        self.users.remove(self)  # 用户关闭连接后从容器中移除用户
        for u in self.users:
            u.write_message(
                u"[%s]-[%s]-离开聊天室" % (self.request.remote_ip, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")))

    def check_origin(self, origin):
        return True  # 允许WebSocket的跨域请求


def getResponse2(info):
    # print(_info)
    apiUrl = 'http://www.tuling123.com/openapi/api'
    data = {
        'key': 'fde68f6acf74404a93bca14e9d9dea0e',  # 如果这个Tuling Key不能用,那就换一个
        'info': info,  # 这是我们发出去的消息
        'userid': 'inboat',  # 这里你想改什么都可以
    }
    # 我们通过如下命令发送一个post请求
    r = requests.post(apiUrl, data=data).json()

    # 让我们打印一下返回的值,看一下我们拿到了什么
    return r


def test_push_data2():
    client = tornado.httpclient.AsyncHTTPClient()

    url = "http://www.tuling123.com/openapi/api"
    data = {}
    data['key'] = '7c1ccc2786df4e1685dda9f7a98c4ec9'
    data['info'] = "nihao"
    data['userid'] = 'wechat-robot'
    par = json.dumps(data)
    print (par)
    response = client.fetch(url, method='POST', body=par, callback=test_push_data2_resp)


def test_push_data2_resp(resp):
    print ("test_push_data2_resp 2, %s" % repr(resp.body))


if __name__ == '__main__':
    tornado.options.parse_command_line()
    app = tornado.web.Application([
        (r"/", IndexHandler),
        (r"/chat", ChatHandler),
    ],
        static_path=os.path.join(os.path.dirname(__file__), "static"),
        template_path=os.path.join(os.path.dirname(__file__), "template"),
        debug=True
    )
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

你可能感兴趣的:(愉快的搞基,利用Python打造上万并发的聊天室)