tornado websocket 学习demo:简单聊天室

本文介绍了一个简单的WebSocket聊天应用实现过程,包括如何搭建服务器端及客户端交互,并提供了完整的Python代码及HTML页面示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:
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>    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值