基于Tornado的websocket实现聊天室

self.render-string()  渲染成字符串

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .container{
            border: 2px solid #dddddd;
            height: 400px;
            overflow: auto;
        }
    </style>
</head>
<body>
    <div style="width: 750px;margin: 0 auto;">
        <h1>1024聊天室</h1>
        <div class="container">

        </div>
        <div class="input">
            <input type="text" id="txt" />
            <input type="button" value="发送" id="btn" onclick="sendMessage();" />
        </div>
    </div>

    <script src="/static/jquery-1.12.4.js"></script>
    <script>
        ws = new WebSocket("ws://127.0.0.1:8888/chat");
        ws.onmessage = function (event) {
            $(‘.container‘).append(event.data);
        };
        ws.onclose = function () {

        };
        function sendMessage() {
            ws.send($(‘#txt‘).val());
        }
    </script>
</body>
</html>

index.html

import tornado.web
import tornado.ioloop
import tornado.websocket
class IndexHandler(tornado.web.RequestHandler):

    def get(self, *args, **kwargs):
        self.render(‘index.html‘)

users = set()
class ChatHandler(tornado.websocket.WebSocketHandler):

    def open(self, *args, **kwargs):
        """
        客户端和服务端已经建立连接
        1. 连接
        2. 握手
        :param args:
        :param kwargs:
        :return:
        """
        users.add(self)

    def on_message(self, message):
        content = self.render_string(‘message.html‘,msg=message)
        for client in users:
            client.write_message(content)

    def on_close(self):
        """
        客户端主动关闭连接
        :return:
        """
        users.remove(self)

def run():
    settings = {
        ‘template_path‘: ‘templates‘,
        ‘static_path‘: ‘static‘,
    }
    application = tornado.web.Application([
        (r"/", IndexHandler),
        (r"/chat", ChatHandler),

    ], **settings)
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    run()

app.py

原文地址:https://www.cnblogs.com/jintian/p/11445360.html

时间: 2024-10-31 00:58:02

基于Tornado的websocket实现聊天室的相关文章

基于django channel 实现websocket的聊天室

websocket ? 网易聊天室? ? web微信? ? 直播? 假如你工作以后,你的老板让你来开发一个内部的微信程序,你需要怎么办?我们先来分析一下里面的技术难点 消息的实时性? 实现群聊 现在有这样一个需求,老板给到你了,关乎你是否能转正?你要怎么做? 我们先说消息的实时性,按照我们目前的想法是我需要用http协议来做,那么http协议怎么来做那? 是不是要一直去访问我们的服务器,问服务器有没有人给我发消息,有没有人给我发消息?那么大家认为我多长时间去访问一次服务比较合适那? 1分钟1次?

基于Select模型的混乱聊天室v1.0

最近在无聊完成了一个简单的基于select模型的匿名聊天室程序,均使用C++开发 服务器工作原理: 每接收一条客户端的信息,就将遍历所有的socket,并将该信息发给所有的客户端. 客户端使用两条线程,一个是接收服务端信息的线程,一个是等待阻塞输入的线程,获得输入时,将输入发送到服务器. 项目源码:https://github.com/coderguang/Chat 版本为v2.0的release. 其中ComLib也在github上 服务器核心代码: int main(int argc,cha

基于LINUX的多功能聊天室

原文:基于LINUX的多功能聊天室 基于LINUX的多功能聊天室 其实这个项目在我电脑已经躺了多时,最初写完项目规划后,我就认认真真地去实现了它,后来拿着这个项目区参加了面试,同样面试官也拿这个项目来问我,当然我是做过一遍了,而且为了面试,我将什么strcpy,strlen等最常用的函数都自己实现了一遍,说着,我感觉自己有点挺用功的样子呢! 后来,工作也定下来了,等三方,然后继续帮助我的导师做项目,经过老师的威逼利诱下,我屈服了,又把智能家居系统作为项目,同时也是我的毕业设计,而且功能还要十分完

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室.

使用Tomcat实现基于iframe streaming的Comet聊天室

首先,无图无真相,先上图: 这是一个基于Comet实现的聊天室Demo,功能类似于QQ群聊.聊天过程中如果有新想消息,那么就需要服务器推送消息到浏览器,所以这里可以使用Comet技术. Comet一般有两种实现方式:长轮询(long-polling).流(streaming).而本文中的这个Demo的实现方式是基于流(streaming),前端使用了一个隐藏的iframe,这也是比较常用的一种方式.不过由于使用iframe流,导致浏览器上面的进度一直在转,这是因为iframe一直在加载的原因,先

基于linux的TCP网络聊天室设计与实现

利用Linux实现基于TCP模式的网络聊天程序 主要完成的两大组成部分为:服务器和客户端. 服务器程序主要负责监听客户端发来的消息. 客户端需要登录到服务器端才可以实现正常的聊天功能.该程序是利用进程以及共享内存来实现群发送消息的. 以下简单分析一下服务器端和客户端两个方面所要完成的任务. 服务器的主要功能如下: 在特定的端口上进行监听,等待客户端的连接. 用户可以配置服务器端的监听端口. 向连接的客户端发送登录成功信息. 向已经连接到服务器的客户端的用户发送系统消息. 使用TCP多线程并发服务

基于EPOLL模型的局域网聊天室和Echo服务器

一.EPOLL的优点 在Linux中,select/poll/epoll是I/O多路复用的三种方式,epoll是Linux系统上独有的高效率I/O多路复用方式,区别于select/poll.先说select/poll的缺点,以体现epoll的优点. select: (1)可监听的socket受到限制,在32位的系统中,默认最大值为1024. (2)采用轮询方式,当要监听的sock数量很大时,效率低. (3)随着要监听socket数据的增加,要维护一个存放大量fd的数据结构,系统开销太大. pol

php+html5基于websocket实现聊天室的方法

<?php error_reporting(E_ALL); ob_implicit_flush(); $sk=new Sock('127.0.0.1',8000); $sk->run(); class Sock{ public $sockets; public $users; public $master; public function __construct($address, $port){ $this->master=$this->WebSocket($address, $

Spring Boot2 系列教程 (十七) | 整合 WebSocket 实现聊天室

微信公众号:一个优秀的废人.如有问题,请后台留言,反正我也不会听. 前言 昨天那篇介绍了 WebSocket 实现广播,也即服务器端有消息时,将消息发送给所有连接了当前 endpoint 的浏览器.但这无法解决消息由谁发送,又由谁接收的问题.所以,今天写一篇实现一对一的聊天室. 今天这一篇建立在昨天那一篇的基础之上,为便于更好理解今天这一篇,推荐先阅读:「SpringBoot 整合WebSocket 实现广播消息 」 准备工作 Spring Boot 2.1.3 RELEASE Spring S