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) 收藏 举报
浙公网安备 33010602011771号