tornado十五:实战--实现群聊

一、WebSocket

WebSocket概述:

  WebSocket是HTML5规范中提出的新的客户端-服务器通信协议,该 协议本身使用新的ws://url

  WebSocket是独立的,创建在TCP协议之上的协议,和HTTP的唯一关系是使用一HTTP协议的101状态

  WebSocket使客户端与服务器之间的数据交互变得更加简单,允许服务器直接向客户端推送数据而不是

  目前大多数主流浏览器都已经支持WebSocket

tornado中的WebSocket模块:

  WebSocketHandler:处理通信的Handler类

  open():当一个WebSocket连接建立后被调用

  on_message(message):当客户端发送消息到服务器时调用

  on_close():客户端主动关闭WebSocket连接后调用

  write_message(message, binary=False):服务器主动向客户端发送message消息。message可以是字符串,或字典(会自动转成jason字符串)。

    如果binary为False,则message会以UTF-8编码发送;如果为True,则发送二进制的字节码。

  close():服务器关闭客户端的WebSocket连接

  check_origin(origin):判断源origin,对于符合条件的请求允许连接

二、群聊前端代码:

# templates/home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>聊天界面</title>
    <script type="text/javascript" charset="utf-8" src=" {{static_url('js/jquery.min.js')}}"></script>
</head>
<body>
    <div id="contents" style="width:500px;height:500px;overflow:auto">

    </div>
    <div>
        <input type="text" id="message"/>
        <button onclick="sendMessage()">发送</button>
    </div>
    <script>
        //建立WebSocket连接
        var ws = new WebSocket("ws://192.168.1.10:8000/chat")
        //接收服务器的消息
        ws.onmessage = function(e) {
            $('#contents').append("<p>"+e.data+"</p>")
        }
        //向服务器发送消息
        function sendMessage() {
            <!--console.log("************************")-->
            var message = $('#message').val()
            ws.send(message)
            $('#message').val("")
        }
    </script>

</body>
</html>

 

三、服务器代码

# application.py
# coding=utf-8
import tornado.web.Application

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            ('r/home', index.HomeHandler),
            ('r/sutdents', index.StudentsHandler),
        ]
        super(Application, self).__init__(self, handlers, **config.settings)
# index.py
class HomeHandler(RequestHandler):
    def get(self, *args, **kwargs):
        self.write("home.html")

from tornado.websocket import WebSocketHandler
class ChatHandler(WebSocketHandler):
    users = []
    def open(self, *args, **kwargs):
        # 客户端连接时,并通知所有人
        self.users.append(self)
        # print(self.users)
        for user in self.users:
            user.write_message(u"[%s]登录了" % self.request.remote_ip)

    def on_message(self, message):
        # 接收客户端的消息,并转发
        for user in self.users:
            user.write_message(u"[%s]说:[%s]" % (self.request.remote_ip, message))
    def on_close(self):
        # 客户端关闭时,并通知所有人
        self.users.remove(self)
        for user in self.users:
            user.write_message(u"[%s]退出了" % self.request.remote_ip)
    def check_origin(self, origin):
        return True

 

posted on 2018-08-11 21:33  myworldworld  阅读(168)  评论(0)    收藏  举报

导航