前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在线聊天室

在线聊天室

作者头像
星哥玩云
发布2022-09-14 19:12:12
2.6K0
发布2022-09-14 19:12:12
举报
文章被收录于专栏:开源部署

一、前端JavaScript编写

在前端JS中使用WebSocket与服务器通讯如下

代码语言:javascript
复制
var ws = new WebSocket("ws://127.0.0.1:8000/websocket"); // 新建一个ws连接
ws.onopen = function() {  // 连接建立好后的回调
   ws.send("Hello, world");  // 向建立的连接发送消息
};
ws.onmessage = function (evt) {  // 收到服务器发送的消息后执行的回调
   alert(evt.data);  // 接收的消息内容在事件参数evt的data属性中
};

前端完整代码

代码语言:javascript
复制
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>聊天室</title>
    <style>
        body,ul,li{
            margin: 0;
            padding: 0;
            list-style: none;
        }
        #box{
            width:800px;
            margin: auto;
        }

        #con{
            height: 400px;
            width: 100%;
            background-color: aqua;
            overflow-x: scroll;
            border-radius: 20px;

        }
        .page_con>li{
            height: 30px;
            text-align: left;
            line-height: 30px;
            margin-left:10px;
            margin-top:10px;
        }
        #send_message{
            height: 60px;
            width: 99%;
            resize: none;
            margin-top: 10px;
            font-size: 20px;
            border: 1px dotted red;
        }
        button{
            border: none;
            width: 50px;
            height: 30px;
            float: right;
            border-radius: 10px;
            color:aqua;
        }
    </style>
    <script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>

</head>
<body>
<div id="box">
    <div id="top">
        <h1>Lucky在线聊天室</h1>
    </div>
    <div id="con">
        <ul class="page_con">

        </ul>
    </div>
    <textarea name="" id="send_message" cols="30" rows="10"></textarea>
    <button type="button" onclick="sendMsg()">发送</button>
</div>

<script type="text/javascript">
        var ws = new WebSocket("ws://127.0.0.1:8000/chat");

        function sendMsg() {
            var msg = $("#send_message").val();
            ws.send(msg);
            $("#send_message").val("");
        }
        ws.onmessage = function(e) {
            $(".page_con").append("<li>" + e.data + "</li>");
        }
    </script>
</body>
</html>

二、后端代码实现

server.py

代码语言:javascript
复制
<span class="hljs-keyword">import</span> tornado.web
<span class="hljs-keyword">import</span> tornado.ioloop
<span class="hljs-keyword">import</span> tornado.httpserver
<span class="hljs-keyword">import</span> tornado.options
<span class="hljs-keyword">import</span> os
<span class="hljs-keyword">import</span> datetime

<span class="hljs-keyword">from</span> tornado.web <span class="hljs-keyword">import</span> RequestHandler
<span class="hljs-keyword">from</span> tornado.options <span class="hljs-keyword">import</span> define, options
<span class="hljs-keyword">from</span> tornado.websocket <span class="hljs-keyword">import</span> WebSocketHandler

define(<span class="hljs-string">"port"</span>, default=<span class="hljs-number">8000</span>, type=int)

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">IndexHandler</span><span class="hljs-params">(RequestHandler)</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get</span><span class="hljs-params">(self)</span>:</span>
        self.render(<span class="hljs-string">"index.html"</span>)

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ChatHandler</span><span class="hljs-params">(WebSocketHandler)</span>:</span>

    users = set()  <span class="hljs-comment"># 用来存放在线用户的容器</span>

    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">open</span><span class="hljs-params">(self)</span>:</span>
        self.users.add(self)  <span class="hljs-comment"># 建立连接后添加用户到容器中</span>
        <span class="hljs-keyword">for</span> u <span class="hljs-keyword">in</span> self.users:  <span class="hljs-comment"># 向已在线用户发送消息</span>
            u.write_message(<span class="hljs-string">u"[%s]-[%s]-进入聊天室"</span> % (self.request.remote_ip, datetime.datetime.now().strftime(<span class="hljs-string">"%Y-%m-%d %H:%M:%S"</span>)))

    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">on_message</span><span class="hljs-params">(self, message)</span>:</span>
        <span class="hljs-keyword">for</span> u <span class="hljs-keyword">in</span> self.users:  <span class="hljs-comment"># 向在线用户广播消息</span>
            u.write_message(<span class="hljs-string">u"[%s]-[%s]-说:%s"</span> % (self.request.remote_ip, datetime.datetime.now().strftime(<span class="hljs-string">"%Y-%m-%d %H:%M:%S"</span>), message))

    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">on_close</span><span class="hljs-params">(self)</span>:</span>
        self.users.remove(self) <span class="hljs-comment"># 用户关闭连接后从容器中移除用户</span>
        <span class="hljs-keyword">for</span> u <span class="hljs-keyword">in</span> self.users:
            u.write_message(<span class="hljs-string">u"[%s]-[%s]-离开聊天室"</span> % (self.request.remote_ip, datetime.datetime.now().strftime(<span class="hljs-string">"%Y-%m-%d %H:%M:%S"</span>)))

    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">check_origin</span><span class="hljs-params">(self, origin)</span>:</span>
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">True</span>  <span class="hljs-comment"># 允许WebSocket的跨域请求</span>

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:
    tornado.options.parse_command_line()
    app = tornado.web.Application([
            (<span class="hljs-string">r"/"</span>, IndexHandler),
            (<span class="hljs-string">r"/chat"</span>, ChatHandler),
        ],
        static_path = os.path.join(os.path.dirname(__file__), <span class="hljs-string">"static"</span>),
        template_path = os.path.join(os.path.dirname(__file__), <span class="hljs-string">"template"</span>),
        debug = <span class="hljs-keyword">True</span>
        )
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前端JavaScript编写
  • 二、后端代码实现
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档