# encoding=utf-8
import tornado.ioloop
import tornado.web
import tornado.websocket
import json
import time
import HTMLParser
import Image
import tempfile
import json
import socket
import fcntl
import struct
import re
import os
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
class web(tornado.websocket.WebSocketHandler):
clients = set()
user = {}
@staticmethod
def send_to_all(message):
for c in web.clients:
c.write_message(message)
@staticmethod
def send_to_all_notme(message, self):
for c in web.clients:
if c == self: continue
c.write_message(message)
def open(self):
date = time.strftime("%H:%M:%S", time.localtime())
self.write_message(json.dumps({
'type': 'init',
'self_id': id(self),
'message': u'Welcome to Web Chat Author by LiZhong!',
'time' : date,
}))
def on_close(self):
date = time.strftime("%H:%M:%S", time.localtime())
web.clients.remove(self)
if web.user.has_key(id(self)):
username = web.user[id(self)]['user']
else:
username = 'None'
web.send_to_all({
'type': 'sys',
'message': username + u' Get out',
'time' : date,
})
del web.user[id(self)]
def on_message(self, message):
date = time.strftime("%H:%M:%S", time.localtime())
user_id = id(self)
if web.user.has_key(user_id):
if message == ':who':
self.write_message(json.dumps({
'type': 'command',
'fun' : 'who',
'user': web.user,
}))
elif message.split()[0] == ':img':
if not message.split()[1]:return False
if web.user.has_key(user_id):
username = web.user[user_id]['user']
else:
username = 'None'
web.send_to_all({
'type': 'img',
'id': user_id,
'user' : username,
'message': message.split()[1],
'time' : date,
})
elif re.match(r'\w{64}\.(jpg|jpeg|png|gif)' , message) and os.path.exists('./static/upload/'+message):
message = '/static/upload/'+message
if web.user.has_key(user_id):
username = web.user[user_id]['user']
else:
username = 'None'
web.send_to_all_notme({
'type': 'img',
'id': user_id,
'user' : username,
'message': message,
'time' : date,
},self)
else:
if web.user.has_key(user_id):
username = web.user[user_id]['user']
else:
username = 'None'
web.send_to_all({
'type': 'user',
'id': user_id,
'user' : username,
'message': message,
'time' : date,
})
else:
web.user[user_id] = {'user' : message,'time':date }
web.send_to_all({
'type': 'sys',
'message': message + u' Come in',
'time' : date,
})
web.clients.add(self)
print web.user
class Upload(tornado.web.RequestHandler):
def get(self):
self.html({'error' : 1, 'msg' : u'Access Error!'})
def post(self):
myfile = self.request.files.get('file')
filename = self.get_argument('filename', False)
if not filename :
self.html({'error' : 1, 'msg' : u'缺少filename参数'})
return False
image_type_list = ['image/gif', 'image/jpeg','image/pjpeg', 'image/bmp', 'image/png', 'image/x-png']
if myfile is None:
self.html({'error' : 1, 'msg' : u'请选择图片'})
return False
for f in myfile:
if f['content_type'] not in image_type_list:
self.html({'error' : 1, 'msg' : u'图片类型错误'})
return False
# write a file
tf = tempfile.NamedTemporaryFile()
tf.write(f['body'])
tf.seek(0)
# create normal file
try:
img = Image.open(tf.name)
except IOError, error:
self.html({'error' : 1, 'msg' : u'图片不合法'})
return False
img.save("./static/upload/" + filename )
tf.close()
self.html({'error' : 0, 'msg' : u'上传成功'})
def html(self,result):
print result
self.write(json.dumps( result ,separators=(',',':')))
#html = '<script type="text/javascript">window.parent.CKEDITOR.tools.callFunction('+str(fn)+', \''+fileurl+'\', \''+msg+'\');</script>'
#html = '<script type="text/javascript">alert(\''+str(fn)+', '+fileurl+', '+msg+'\');</script>'
#self.write(html)
class Index(tornado.web.RequestHandler):
def get(self):
self.render('web.html')
class Other(tornado.web.RequestHandler):
def get(self, s):
self.write('error!')
def ip(self, ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915,
struct.pack('256s', ifname[:15])
)[20:24])
settings = {
'static_path' : os.path.join(os.getcwd(),"static"),
}
application = tornado.web.Application([
(r"/", Index ),
(r"/websocket", web),
(r"/upload", Upload),
(r"/(.*?)", Other),
], **settings )
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【作品名称】:基于Python与HTML5实现的websocket聊天室 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: webchat 一个机遇WebSocket的聊天室,后端用Python编写。只要浏览器支持WebSocket即可。 功能: 查看在线人数 清屏 拖拽图片 修改背景颜色 修改前景颜色 发送远程图片 表情 特点: 是一个类似于linux操作界面的聊天室,完全通过键盘操作,而不需要鼠标。 一个机遇WebSocket的聊天室,后端用Python编写。只要浏览器支持WebSocket即可。 功能: 查看在线人数 清屏 拖拽图片 修改背景颜色 修改前景颜色 发送远程图片 表情 特点: 是一个类似于linux操作界面的聊天室,完全通过键盘操作,而不需要鼠标。 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础能够看懂代码,能够自行调试代码并解决报错,能够自行添加功能修改代码。
资源推荐
资源详情
资源评论
收起资源包目录
webchat-master.zip (29个子文件)
webchat-master
README 336B
main.py 5KB
web.html 1KB
static
jquery.json-2.4.min.js 2KB
loading.gif 13KB
web.js 17KB
jquery-1.9.1.min.js 90KB
ico
12.gif 3KB
6.gif 4KB
8.gif 4KB
14.gif 10KB
0.gif 5KB
20.gif 7KB
21.gif 11KB
7.gif 5KB
19.gif 1KB
5.gif 3KB
18.gif 13KB
2.gif 5KB
9.gif 2KB
15.gif 6KB
3.gif 4KB
11.gif 8KB
1.gif 1KB
16.gif 3KB
13.gif 2KB
4.gif 2KB
10.gif 2KB
17.gif 6KB
共 29 条
- 1
资源评论
小英子架构
- 粉丝: 1010
- 资源: 4042
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功