服务端

import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
import os
import datetime from tornado.web import RequestHandler
from tornado.options import define, options
from tornado.websocket import WebSocketHandler define("port", default=8000, type=int) class IndexHandler(RequestHandler):
def get(self):
self.render("index.html") class ChatHandler(WebSocketHandler): cli = set() # 用来存放在线用户的容器 def open(self):
print(self.request)
self.cli.add(self) # 建立连接后添加用户到容器中
for c in self.cli: # 向已在线用户发送消息
c.write_message(u"[%s]-[%s]-进入聊天室" % (self.request.remote_ip, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) def on_message(self, message):
for c in self.cli: # 向在线用户广播消息
c.write_message(u"[%s]-[%s]-说:%s" % (self.request.remote_ip, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), message)) def on_close(self):
self.cli.remove(self) # 用户关闭连接后从容器中移除用户
for c in self.cli:
c.write_message(u"[%s]-[%s]-离开聊天室" % (self.request.remote_ip, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) def check_origin(self, origin):
return True # 允许WebSocket的跨域请求 if __name__ == '__main__':
tornado.options.parse_command_line()
app = tornado.web.Application([
(r"/", IndexHandler),
(r"/chat", ChatHandler),
],
static_path = os.path.join(os.path.dirname(__file__), "static"),
template_path = os.path.join(os.path.dirname(__file__), "template"),
debug = True
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()

客户端

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>聊天室</title>
</head>
<style type="text/css">
#char{
margin: 0 auto;
height:500px;
width: 800px;
}
#contents{
height:500px;
width: 800px;
border:1px solid #cccccc;
border-radius:3px;
box-shadow: 2px 2px 5px #888888;
margin-bottom: 10px;
}
.input_send #msg{
height:20px;
width: 757px;
}
</style>
<body>
<div id="char" >
<div id="contents"></div>
<div class="input_send">
<textarea id="msg"></textarea>
<a href="javascript:;" id="send_mesage" onclick="sendMsg()">发送</a>
</div>
</div>
<script src="{{static_url('js/jquery.min.js')}}"></script>
<script type="text/javascript">
var ws = new WebSocket("ws://192.168.199.182:9000/chat");
ws.onmessage = function(e) {
$("#contents").append("<p>" + e.data + "</p>");
}
function sendMsg() {
var msg = $("#msg").val();
ws.send(msg);
$("#msg").val("");
}
</script>
</body>
</html>

python websocket 再线聊天室的 Demo的更多相关文章

  1. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...

  2. Java和WebSocket开发网页聊天室

    小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项 ...

  3. 第四节:SignalR灵魂所在Hub模型及再探聊天室样例

    一. 整体介绍 本节:开始介绍SignalR另外一种通讯模型Hub(中心模型,或者叫集线器模型),它是一种RPC模式,允许客户端和服务器端各自自定义方法并且相互调用,对开发者来说相当友好. 该节包括的 ...

  4. workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)

    workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...

  5. 分享基于 websocket 网页端聊天室

    博客地址:https://ainyi.com/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websock ...

  6. python使用websocket简单组建聊天室

    server端 ###websocket_server### import socket import threading sock = socket.socket(socket.AF_INET, s ...

  7. node.js+websocket实现简易聊天室

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...

  8. 使用Html5下WebSocket搭建简易聊天室

    一.Html5WebSocket介绍 WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站 ...

  9. Netty 系列八(基于 WebSocket 的简单聊天室).

    一.前言 之前写过一篇 Spring 集成 WebSocket 协议的文章 —— Spring消息之WebSocket ,所以对于 WebSocket 协议的介绍就不多说了,可以参考这篇文章.这里只做 ...

随机推荐

  1. 采用自定义协议代替OCX组件

    事情起源:公司视频播放一直是采用的嵌入浏览器组件实现视频的预览回放等功能.这种实现方式要求客户使用IE浏览器. 最近上线项目使用Html 5开发,要求IE11.项目中使用了视频播放功能,如果全部升级到 ...

  2. 基础总结(04)-- display:none;&&visibility:hidden;区别

    display:none 1.使元素隐藏,不再占据空间. 2.动态操作时会引起页面回流和重绘,影响性能. 3.子元素也会被隐藏并且添加display:block/visibility:visible无 ...

  3. Oracle不常用SQL

    Oracle 查询最近创建的表 select * from user_objects where object_type='TABLE' order by created desc Oracle 查询 ...

  4. Anatomy of a Database System学习笔记 - 概论、并发控制

    <Anatomy of a Database System>这篇发表于87年.一共48页的论文据说是DBA入门必看,但是找了全网没有找到中文翻译.这篇文章对关系型数据库确实有提纲挈领的作用 ...

  5. reg 和wire 区别

    reg相当于存储单元,wire相当于物理连线 Verilog 中变量的物理数据分为线型和寄存器型.这两种类型的变量在定义时要设置位宽,缺省为1位.变量的每一位可以是0,1,X,Z.其中x代表一个未被预 ...

  6. cached_property的使用

    cached_property修饰过的函数,变成是对象的属性,该对象第一次引用该属性时,会调用函数,对象第二次引用该属性时就直接从词典中取了,这也说明引用属性是经过__getattritue__. c ...

  7. 16Linxu_Squid_iSCSI

    使用Squid部署代理缓存服务 yum install squid 标准正向代理: 透明正向代理 反向代理 ACL访问控制 使用iSCSI服务部署网络存储 yum install targetd ta ...

  8. springboot + schedule

    参考文章:https://blog.csdn.net/sinianliushui/article/details/78841713 参考文章: https://blog.csdn.net/hao703 ...

  9. C++重写new和delete,比想像中困难

    关于C++内存管理这话题,永远都不过时.在我刚出道的时候,就已经在考虑怎么检测内存泄漏(https://www.cnblogs.com/coding-my-life/p/3985164.html).想 ...

  10. CSS : color and unit

    Color: CSS中定义颜色使用十六进制(hex)表示法为红,绿,蓝的颜色值结合.可以是最低值是0(十六进制00)到最高值是 255(十六进制FF).3个双位数字的十六进制值写法,以#符号开始部分颜 ...