Tornado实现聊天室功能(websocket)


  小试了一把Tornado的websocket来实现聊天室的功能,非常简单,上代码:

 


服务器端:


[python]
import logging 
import tornado.escape 
import tornado.ioloop 
import tornado.options 
import tornado.web 
import tornado.websocket 
import os.path 
import uuid 
 
from tornado.options import define, options 
 
define("port", default=8888, help="run on the given port", type=int) 
 
 
class Application(tornado.web.Application): 
    def __init__(self): 
        handlers = [ 
            (r"/", MainHandler), 
            (r"/websocket", ChatSocketHandler), 
        ] 
        settings = dict( 
            cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", 
            template_path=os.path.join(os.path.dirname(__file__), "templates"), 
            static_path=os.path.join(os.path.dirname(__file__), "static"), 
            xsrf_cookies=True, 
        ) 
        tornado.web.Application.__init__(self, handlers, **settings) 
 
 
class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
        self.render("index.html", messages=ChatSocketHandler.cache) 
 
class ChatSocketHandler(tornado.websocket.WebSocketHandler): 
    waiters = set() 
    cache = [] 
    cache_size = 200 
 
    def allow_draft76(self): 
        # for iOS 5.0 Safari  
        return True 
 
    def open(self): 
        print "new client opened" 
        ChatSocketHandler.waiters.add(self) 
 
    def on_close(self): 
        ChatSocketHandler.waiters.remove(self) 
 
    @classmethod 
    def update_cache(cls, chat): 
        cls.cache.append(chat) 
        if len(cls.cache) > cls.cache_size: 
            cls.cache = cls.cache[-cls.cache_size:] 
 
    @classmethod 
    def send_updates(cls, chat): 
        logging.info("sending message to %d waiters", len(cls.waiters)) 
        for waiter in cls.waiters: 
            try: 
                waiter.write_message(chat) 
            except: 
                logging.error("Error sending message", exc_info=True) 
 
    def on_message(self, message): 
        logging.info("got message %r", message) 
 
        ChatSocketHandler.send_updates(message) 
 
 
def main(): 
    tornado.options.parse_command_line() 
    app = Application() 
    app.listen(8080) 
    tornado.ioloop.IOLoop.instance().start() 
 
 
if __name__ == "__main__": 
    main() 

import logging
import tornado.escape
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
import os.path
import uuid

from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)


class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r"/", MainHandler),
            (r"/websocket", ChatSocketHandler),
        ]
        settings = dict(
            cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
            template_path=os.path.join(os.path.dirname(__file__), "templates"),
            static_path=os.path.join(os.path.dirname(__file__), "static"),
            xsrf_cookies=True,
        )
        tornado.web.Application.__init__(self, handlers, **settings)


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html", messages=ChatSocketHandler.cache)

class ChatSocketHandler(tornado.websocket.WebSocketHandler):
    waiters = set()
    cache = []
    cache_size = 200

    def allow_draft76(self):
        # for iOS 5.0 Safari
        return True

    def open(self):
        print "new client opened"
        ChatSocketHandler.waiters.add(self)

    def on_close(self):
        ChatSocketHandler.waiters.remove(self)

    @classmethod
    def update_cache(cls, chat):
        cls.cache.append(chat)
        if len(cls.cache) > cls.cache_size:
            cls.cache = cls.cache[-cls.cache_size:]

    @classmethod
    def send_updates(cls, chat):
        logging.info("sending message to %d waiters", len(cls.waiters))
        for waiter in cls.waiters:
            try:
                waiter.write_message(chat)
            except:
                logging.error("Error sending message", exc_info=True)

    def on_message(self, message):
        logging.info("got message %r", message)

        ChatSocketHandler.send_updates(message)


def main():
    tornado.options.parse_command_line()
    app = Application()
    app.listen(8080)
    tornado.ioloop.IOLoop.instance().start()


if __name__ == "__main__":
    main()
客户端:


[html]
<html><head><title>Web Socket Client</title></head>   
 
<body>   
 
<script type="text/javascript">   
 
var socket;   
 
if (!window.WebSocket) {   
 
    window.WebSocket = window.MozWebSocket;   
 
}   
 
// Javascript Websocket Client   
 
if (window.WebSocket) {   
 
    socket = new WebSocket("ws://10.197.60.125:8080/websocket");   
 
    socket.onmessage = function(event) {   
 
        var ta = document.getElementById('responseText');   
 
        ta.value = ta.value + '\n' + event.data   
 
    };   
 
    socket.onopen = function(event) {   
 
        var ta = document.getElementById('responseText');   
 
        ta.value = "Web Socket opened!";   
 
    };   
 
    socket.onclose = function(event) {   
 
        var ta = document.getElementById('responseText');   
 
        ta.value = ta.value + "Web Socket closed";   
 
    };   
 
} else {   
 
    alert("Your browser does not support Web Socket.");   
 
}   
 
// Send Websocket data   
 
function send(message) {   
 
    if (!window.WebSocket) { return; }   
 
    if (socket.readyState == WebSocket.OPEN) {   
 
        socket.send(message);   
 
    } else {   
 
        alert("The socket is not open.");   
 
    }   
 
}   
 
</script>   
 
<h3>Send :</h3>   
 
<form onsubmit="return false;">   
 
<input type="text" name="message" value="Hello World!"/><input type="button" value="Send Web Socket Data" onclick="send(this.form.message.value)" />   
 
<h3>Receive :</h3>   
 
<textarea id="responseText" style="width:500px;height:300px;"></textarea>   
 
</form>   
 
</body>   
 
</html>   

<html><head><title>Web Socket Client</title></head> 

<body> 

<script type="text/javascript"> 

var socket; 

if (!window.WebSocket) { 

    window.WebSocket = window.MozWebSocket; 

// Javascript Websocket Client 

if (window.WebSocket) { 

    socket = new WebSocket("ws://10.197.60.125:8080/websocket"); 

    socket.onmessage = function(event) { 

        var ta = document.getElementById('responseText'); 

        ta.value = ta.value + '\n' + event.data 

    }; 

    socket.onopen = function(event) { 

        var ta = document.getElementById('responseText'); 

        ta.value = "Web Socket opened!"; 

    }; 

    socket.onclose = function(event) { 

        var ta = document.getElementById('responseText'); 

        ta.value = ta.value + "Web Socket closed"; 

    }; 

} else { 

    alert("Your browser does not support Web Socket."); 

// Send Websocket data 

function send(message) { 

    if (!window.WebSocket) { return; } 

    if (socket.readyState == WebSocket.OPEN) { 

        socket.send(message); 

    } else { 

        alert("The socket is not open."); 

    } 

</script> 

<h3>Send :</h3> 

<form onsubmit="return false;"> 

<input type="text" name="message" value="Hello World!"/><input type="button" value="Send Web Socket Data" onclick="send(this.form.message.value)" /> 

<h3>Receive :</h3> 

<textarea id="responseText" style="width:500px;height:300px;"></textarea> 

</form> 

</body> 

</html> 


 

相关内容

    暂无相关文章

评论关闭