1.app.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import uuid
import json
import tornado.ioloop
import tornado.web
import tornado.websocket class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.render('index.html') class ChatHandler(tornado.websocket.WebSocketHandler):
# 用户存储当前聊天室用户
waiters = set()
# 用于存储历时消息
messages = [] def open(self):
"""
客户端连接成功时,自动执行
:return:
"""
ChatHandler.waiters.add(self)
uid = str(uuid.uuid4())
self.write_message(uid) for msg in ChatHandler.messages:
content = self.render_string('message.html', **msg)
self.write_message(content) def on_message(self, message):
"""
客户端连发送消息时,自动执行
:param message:
:return:
"""
msg = json.loads(message)
ChatHandler.messages.append(msg) for client in ChatHandler.waiters:
content = client.render_string('message.html', **msg)
client.write_message(content) def on_close(self):
"""
客户端关闭连接时,,自动执行
:return:
"""
ChatHandler.waiters.remove(self) def run():
settings = {
'template_path': 'templates',
'static_path': 'static',
}
application = tornado.web.Application([
(r"/", IndexHandler),
(r"/chat", ChatHandler),
], **settings)
application.listen(8888,address='0.0.0.0')
tornado.ioloop.IOLoop.instance().start() if __name__ == "__main__":
run()

2.message.html

<div style="border: 1px solid #dddddd;margin: 10px;">
<div>游客{{uid}}</div>
<div style="margin-left: 20px;">{{message}}</div>
</div>

3.index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Python聊天室</title>
</head>
<body>
<div>
<input type="text" id="txt"/>
<input type="button" id="btn" value="提交" onclick="sendMsg();"/>
<input type="button" id="close" value="关闭连接" onclick="closeConn();"/>
</div>
<div id="container" style="border: 1px solid #dddddd;margin: 20px;min-height: 500px;"> </div> <script src="/static/jquery-2.1.4.min.js"></script>
<script type="text/javascript">
$(function () {
wsUpdater.start();
}); var wsUpdater = {
socket: null,
uid: null,
start: function() {
var url = "ws://192.168.20.200:8888/chat";
wsUpdater.socket = new WebSocket(url);
wsUpdater.socket.onmessage = function(event) { if(wsUpdater.uid){
wsUpdater.showMessage(event.data);
}else{
wsUpdater.uid = event.data;
}
}
},
showMessage: function(content) {
$('#container').append(content);
}
}; function sendMsg() {
var msg = {
uid: wsUpdater.uid,
message: $("#txt").val()
};
wsUpdater.socket.send(JSON.stringify(msg));
} </script> </body>
</html>

4.引入jQuery

最新文章

  1. Hadoop基础思维导图
  2. 【夯实PHP基础系列】JQuery easyUI的使用
  3. ASP.NET网站入侵第二波(LeaRun.信息化快速开发框架 已被笔者拿下)
  4. Excel 如何引用某表格中的某一列作为数据有效性验证
  5. 最近面试遇到的Windows相关的题目
  6. grunt 构建工具(build tool)初体验
  7. [iOS 开发]UITableView第一行显示不完全
  8. [转] 关于UIView
  9. Windows下安装storm-0.9.1
  10. ZOJ 3331 Process the Tasks 双塔Dp
  11. JPush极光推送 Java调用服务器端API开发
  12. SQL SERVER 查看日志大小及日志已满的处理方法 (转)
  13. Android 跳转权限设置界面的终极方案
  14. 微信授权登录mock(在没有真实微信账号的情况下测试大量微信账户授权登录的情况)
  15. 史上最全最详细的环境搭建教程,行百里者手把手教你在windows下搭建Anaconda+pycharm+库文件(TensorFlow,numpy)环境搭建
  16. MQTT压力测试工具之JMeter插件教程
  17. virtualBox NAT模式,设置虚拟机可上网,宿主机可访问虚拟机的方法
  18. 20135234mqy 实验四
  19. Eclipse上传代码到GitHub
  20. url传参错误的痛

热门文章

  1. ORACLE EHCC(exadata hybrid columnar compression)
  2. .NET编码解码(HtmlEncode与HtmlDecode)
  3. 饮冰三年-人工智能-linux-05 Linux进程
  4. openstack 网络更改版
  5. OOP和面向对象
  6. 修改Tomcat默认连接数
  7. FATAL Fatal error during KafkaServerStable startup. Prepare to shutdown (kafka.server.KafkaServerStartable) java.io.FileNotFoundException: /tmp/kafka-logs/.lock (Permission denied)
  8. Exception in thread &quot;main&quot; java.lang.NullPointerException
  9. 前端面试题集锦及答案解析--HTML、 HTTP、web综合问题
  10. Socket.Io+HttpWebRequest 请求Api