chat demo   
               添加时间:2013-7-2 点击量: 
 
              做一个tornado+websocket chat
里面做了长连接的代码,临时没有实现,下一篇补上
  1 import logging
  2 import os.path
  3 import uuid
  4 import tornado.httpserver
  5 import tornado.ioloop
  6 import tornado.options
  7 import tornado.web
  8 import tornado.websocket
  9 import time
 10 
 11 
 12 def send_message_ws(message):
 13     for handler in ChatSocketHandler.socket_handlers:
 14         try:
 15             handler.write_message(message)
 16         except:
 17             logging.error(Error sending message, exc_info=True)
 18 
 19 
 20 def send_message_lp(message):
 21     for handler in ChatSocketHandler.socket_handlers:
 22         try:
 23             handler.write_message(message)
 24         except:
 25             logging.error(Error sending message, exc_info=True)
 26 
 27     for callback in ChatPollHandler.callbacks:
 28         try:
 29             callback(message)
 30         except:
 31             logging.error(Error in callback, exc_info=True)
 32     ChatPollHandler.callbacks = set()
 33 
 34 
 35 class ChatPollHandler(tornado.web.RequestHandler):
 36     callbacks = set()
 37     users = set()
 38 
 39     @tornado.web.asynchronous
 40     def get(self):
 41         ChatPollHandler.callbacks.add(self.on_new_message)
 42         self.user = user = self.get_cookie(user)
 43         if not user:
 44             self.user = user = str(uuid.uuid4())
 45             self.set_cookie(user, user)
 46         if user not in ChatPollHandler.users:
 47             ChatPollHandler.users.add(user)
 48             send_message_lp(A new user has entered the long pollchat room.)
 49 
 50     def on_new_message(self, message):
 51         if self.request.connection.stream.closed():
 52             return
 53         self.write(message)
 54         self.finish()
 55 
 56     def on_connection_close(self):
 57         ChatPollHandler.callbacks.remove(self.on_new_message)
 58         ChatPollHandler.users.discard(self.user)
 59         send_message_lp(A user has left the long poll chat room.)
 60 
 61     def post(self):
 62         send_message_lp(self.get_argument(text))
 63 
 64 
 65 class MainHandler(tornado.web.RequestHandler):
 66     def get(self):
 67         self.render(index.html)
 68 
 69 
 70 class ChatSocketHandler(tornado.websocket.WebSocketHandler):
 71     socket_handlers = set()
 72 
 73     def open(self):
 74         ChatSocketHandler.socket_handlers.add(self)
 75 
 76     def on_close(self):
 77         ChatSocketHandler.socket_handlers.remove(self)
 78         send_message_ws(A user has left the socket chat room.)
 79 
 80     def on_message(self, message):
 81         send_message_ws(message)
 82 
 83 
 84 def send_test():
 85     i = 0
 86     while True:
 87         send_message_ws(str(i))
 88         i = i + 1
 89         time.sleep(1)
 90 
 91 
 92 def main():
 93     #thread.start_new_thread(send_test, ())
 94     settings = {
 95         template_path: os.path.join(os.path.dirname(__file__), templates),
 96         static_path: os.path.join(os.path.dirname(__file__), static)
 97     }
 98     application = tornado.web.Application(
 99         [(/, MainHandler), (/poll, ChatPollHandler), (/socket, ChatSocketHandler)], settings)
100     http_server = tornado.httpserver.HTTPServer(application)
101     http_server.listen(8080)
102     tornado.ioloop.IOLoop.instance().start()
103 
104 if __name__ == __main__:
105     main()
 html项目组
<!DOCTYPE html>
<html>
<head>
    <title>chat demo</title>
</head>
    <script src=></script>
    <script src=></script>
<script>
function test(ts) {
    ¥(#name_form).hide()
    ¥(#msg_form).show()
    websocket(¥(#name).val())
    return false
}
</script>
<body>
    <p id=name_form>name:<input id=name></input> <input type=button onclick=test() value=进入></p>
    <form style=display:none id=msg_form action=/socket method=post>
        <textarea id=text></textarea>
        <input type=submit value=讲话/>
    </form>
    <div id=msg></div>
</body>
</html>
js项目组
function websocket(name) {
    var ¥msg = ¥(#msg);
    var ¥text = ¥(#text);
    var WebSocket = window.WebSocket || window.MozWebSocket;
    var socket = new WebSocket(ws://192.168.10.148:8080/socket); 
    // 打开Socket 
    socket.onopen = function(event) { 
        // 发送一个初始化消息
        socket.send(I am  + name +  I come here!); 
        // 消息
        socket.onmessage = function(event) { 
            ¥msg.append(
 + event.data + 
);
        }; 
        ¥(#msg_form).submit(function() {
            socket.send(name +  say:  + ¥text.val());
            ¥text.val().();
            return false;
        });
        // Socket的封闭
        socket.onclose = function(event) { 
            ¥msg.append(server is close);
            socket.close() 
        }; 
    };
}
容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永
                     
                  
     
  
 
    
    
做一个tornado+websocket chat
里面做了长连接的代码,临时没有实现,下一篇补上
1 import logging
2 import os.path
3 import uuid
4 import tornado.httpserver
5 import tornado.ioloop
6 import tornado.options
7 import tornado.web
8 import tornado.websocket
9 import time
10
11
12 def send_message_ws(message):
13 for handler in ChatSocketHandler.socket_handlers:
14 try:
15 handler.write_message(message)
16 except:
17 logging.error(Error sending message, exc_info=True)
18
19
20 def send_message_lp(message):
21 for handler in ChatSocketHandler.socket_handlers:
22 try:
23 handler.write_message(message)
24 except:
25 logging.error(Error sending message, exc_info=True)
26
27 for callback in ChatPollHandler.callbacks:
28 try:
29 callback(message)
30 except:
31 logging.error(Error in callback, exc_info=True)
32 ChatPollHandler.callbacks = set()
33
34
35 class ChatPollHandler(tornado.web.RequestHandler):
36 callbacks = set()
37 users = set()
38
39 @tornado.web.asynchronous
40 def get(self):
41 ChatPollHandler.callbacks.add(self.on_new_message)
42 self.user = user = self.get_cookie(user)
43 if not user:
44 self.user = user = str(uuid.uuid4())
45 self.set_cookie(user, user)
46 if user not in ChatPollHandler.users:
47 ChatPollHandler.users.add(user)
48 send_message_lp(A new user has entered the long pollchat room.)
49
50 def on_new_message(self, message):
51 if self.request.connection.stream.closed():
52 return
53 self.write(message)
54 self.finish()
55
56 def on_connection_close(self):
57 ChatPollHandler.callbacks.remove(self.on_new_message)
58 ChatPollHandler.users.discard(self.user)
59 send_message_lp(A user has left the long poll chat room.)
60
61 def post(self):
62 send_message_lp(self.get_argument(text))
63
64
65 class MainHandler(tornado.web.RequestHandler):
66 def get(self):
67 self.render(index.html)
68
69
70 class ChatSocketHandler(tornado.websocket.WebSocketHandler):
71 socket_handlers = set()
72
73 def open(self):
74 ChatSocketHandler.socket_handlers.add(self)
75
76 def on_close(self):
77 ChatSocketHandler.socket_handlers.remove(self)
78 send_message_ws(A user has left the socket chat room.)
79
80 def on_message(self, message):
81 send_message_ws(message)
82
83
84 def send_test():
85 i = 0
86 while True:
87 send_message_ws(str(i))
88 i = i + 1
89 time.sleep(1)
90
91
92 def main():
93 #thread.start_new_thread(send_test, ())
94 settings = {
95 template_path: os.path.join(os.path.dirname(__file__), templates),
96 static_path: os.path.join(os.path.dirname(__file__), static)
97 }
98 application = tornado.web.Application(
99 [(/, MainHandler), (/poll, ChatPollHandler), (/socket, ChatSocketHandler)], settings)
100 http_server = tornado.httpserver.HTTPServer(application)
101 http_server.listen(8080)
102 tornado.ioloop.IOLoop.instance().start()
103
104 if __name__ == __main__:
105 main()
html项目组
<!DOCTYPE html>
<html>
<head>
<title>chat demo</title>
</head>
<script src=></script>
<script src=></script>
<script>
function test(ts) {
¥(#name_form).hide()
¥(#msg_form).show()
websocket(¥(#name).val())
return false
}
</script>
<body>
<p id=name_form>name:<input id=name></input> <input type=button onclick=test() value=进入></p>
<form style=display:none id=msg_form action=/socket method=post>
<textarea id=text></textarea>
<input type=submit value=讲话/>
</form>
<div id=msg></div>
</body>
</html>
js项目组
function websocket(name) {
    var ¥msg = ¥(#msg);
    var ¥text = ¥(#text);
    var WebSocket = window.WebSocket || window.MozWebSocket;
    var socket = new WebSocket(ws://192.168.10.148:8080/socket); 
    // 打开Socket 
    socket.onopen = function(event) { 
        // 发送一个初始化消息
        socket.send(I am  + name +  I come here!); 
        // 消息
        socket.onmessage = function(event) { 
            ¥msg.append(
 + event.data + 
);
        }; 
        ¥(#msg_form).submit(function() {
            socket.send(name +  say:  + ¥text.val());
            ¥text.val().();
            return false;
        });
        // Socket的封闭
        socket.onclose = function(event) { 
            ¥msg.append(server is close);
            socket.close() 
        }; 
    };
}
容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永




