您的位置:首页 > 其它

Tornado实现聊天室功能(websocket)

2013-05-09 15:50 337 查看
         小试了一把Tornado的websocket来实现聊天室的功能,非常简单,上代码:

服务器端:

import logging
import tornado.escape
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
import os.path
import uuid

from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)

class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r"/", MainHandler),
(r"/websocket", ChatSocketHandler),
]
settings = dict(
cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
xsrf_cookies=True,
)
tornado.web.Application.__init__(self, handlers, **settings)

class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render("index.html", messages=ChatSocketHandler.cache)

class ChatSocketHandler(tornado.websocket.WebSocketHandler):
waiters = set()
cache = []
cache_size = 200

def allow_draft76(self):
# for iOS 5.0 Safari
return True

def open(self):
print "new client opened"
ChatSocketHandler.waiters.add(self)

def on_close(self):
ChatSocketHandler.waiters.remove(self)

@classmethod
def update_cache(cls, chat):
cls.cache.append(chat)
if len(cls.cache) > cls.cache_size:
cls.cache = cls.cache[-cls.cache_size:]

@classmethod
def send_updates(cls, chat):
logging.info("sending message to %d waiters", len(cls.waiters))
for waiter in cls.waiters:
try:
waiter.write_message(chat)
except:
logging.error("Error sending message", exc_info=True)

def on_message(self, message):
logging.info("got message %r", message)

ChatSocketHandler.send_updates(message)

def main():
tornado.options.parse_command_line()
app = Application()
app.listen(8080)
tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
main()
客户端:
<html><head><title>Web Socket Client</title></head>

<body>

<script type="text/javascript">

var socket;

if (!window.WebSocket) {

window.WebSocket = window.MozWebSocket;

}

// Javascript Websocket Client

if (window.WebSocket) {

socket = new WebSocket("ws://10.197.60.125:8080/websocket");

socket.onmessage = function(event) {

var ta = document.getElementById('responseText');

ta.value = ta.value + '\n' + event.data

};

socket.onopen = function(event) {

var ta = document.getElementById('responseText');

ta.value = "Web Socket opened!";

};

socket.onclose = function(event) {

var ta = document.getElementById('responseText');

ta.value = ta.value + "Web Socket closed";

};

} else {

alert("Your browser does not support Web Socket.");

}

// Send Websocket data

function send(message) {

if (!window.WebSocket) { return; }

if (socket.readyState == WebSocket.OPEN) {

socket.send(message);

} else {

alert("The socket is not open.");

}

}

</script>

<h3>Send :</h3>

<form onsubmit="return false;">

<input type="text" name="message" value="Hello World!"/><input type="button" value="Send Web Socket Data" onclick="send(this.form.message.value)" />

<h3>Receive :</h3>

<textarea id="responseText" style="width:500px;height:300px;"></textarea>

</form>

</body>

</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: