tornado websocket 学习demo:简单聊天室

25 篇文章 0 订阅
9 篇文章 0 订阅

说明:
1.需要在放chat.py的目录下新建templates,存放index.html文件

template_path=os.path.join(os.path.dirname(__file__), "templates"), 

2.使用的时候访问127.0.0.1:8888
3.效果图为:
这里写图片描述
4.参考:http://blog.csdn.net/lrenjun/article/details/8906099
对原版做了一点修改,主要是

    var url = "ws://"+location.host+"/websocket";
    socket = new WebSocket(url);    

chat.py

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 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(options.port)  
    tornado.ioloop.IOLoop.instance().start()  


if __name__ == "__main__":  
    main()  

templates/index.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) {    
    var url = "ws://"+location.host+"/websocket";
    socket = new WebSocket(url);    

    socket.onmessage = function(event) {    

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

        ta.innerHTML = ta.innerHTML + '<br/>' + 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" onclick="send(this.form.message.value)" />    

<h3>Receive :</h3>    

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

</form>    

</body>    

</html>    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tornado是一个Python的Web框架,它支持异步编程和非阻塞IO操作。Tornado中的WebSocket是一种实现了全双工通信的协议,它允许服务器和客户端之间进行实时的双向通信。 在Tornado中使用WebSocket,你可以通过继承tornado.websocket.WebSocketHandler类来创建一个WebSocket处理器。WebSocketHandler提供了一些方法来处理WebSocket连接的不同事件,例如连接建立、消息接收和连接关闭等。 以下是使用TornadoWebSocket的一般步骤: 1. 创建一个WebSocket处理器类,继承自tornado.websocket.WebSocketHandler。 2. 在处理器类中实现on_message()方法,用于处理接收到的消息。 3. 在处理器类中实现open()方法,用于处理WebSocket连接建立时的操作。 4. 在处理器类中实现on_close()方法,用于处理WebSocket连接关闭时的操作。 5. 在Tornado应用程序中定义路由,将URL映射到WebSocket处理器类。 6. 启动Tornado应用程序。 下面是一个简单的示例代码,演示了如何在Tornado中使用WebSocket: ```python import tornado.websocket import tornado.web import tornado.ioloop class WebSocketHandler(tornado.websocket.WebSocketHandler): def open(self): print("WebSocket连接建立") def on_message(self, message): print("接收到消息:", message) self.write_message("服务器已收到消息:" + message) def on_close(self): print("WebSocket连接关闭") app = tornado.web.Application([ (r"/websocket", WebSocketHandler), ]) if __name__ == "__main__": app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 在上面的示例中,我们创建了一个WebSocket处理器类WebSocketHandler,并实现了open()、on_message()和on_close()方法来处理不同的事件。在应用程序中,我们将URL "/websocket" 映射到WebSocketHandler类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值