`
mywebcode
  • 浏览: 998489 次
文章分类
社区版块
存档分类
最新评论

tornado websocket

 
阅读更多

最近在网上找了些websocket的资料看了下,node和tornado等等本身已经实现了websocket的封装,所以使用起来会比较简单,php如果想要写websocket还需要自己跑一整套流程,比较麻烦。

根据网上的资料写了一个简单的websocket的demo,果真炫酷掉渣天,我是用tornado,网上多是实现实时聊天室的例子,想要实现点对点的聊天功能还需要在send函数那里加条件,目测是根据浏览器用户的id去判断的。代码如下:

服务端代码:

#!/usr/bin/python
#coding:utf-8
import os.path

import tornado.httpserver
import tornado.web
import tornado.ioloop
import tornado.options
import tornado.httpclient
import tornado.websocket

import json
class IndexHandler(tornado.web.RequestHandler):
	def get(self):
		self.render("index.html")

class SocketHandler(tornado.websocket.WebSocketHandler):
	"""docstring for SocketHandler"""
	clients = set()

	@staticmethod
	def send_to_all(message):
	    for c in SocketHandler.clients:
	        c.write_message(json.dumps(message))

	def open(self):
	    self.write_message(json.dumps({
	        'type': 'sys',
	        'message': 'Welcome to WebSocket',
	    }))
	    SocketHandler.send_to_all({
	        'type': 'sys',
	        'message': str(id(self)) + ' has joined',
	    })
	    SocketHandler.clients.add(self)

	def on_close(self):
	    SocketHandler.clients.remove(self)
	    SocketHandler.send_to_all({
	        'type': 'sys',
	        'message': str(id(self)) + ' has left',
	    })

	def on_message(self, message):
		SocketHandler.send_to_all({
            'type': 'user',
            'id': id(self),
            'message': message,
        })
		
##MAIN
if __name__ == '__main__':
	app = tornado.web.Application(
		handlers=[
			(r"/", IndexHandler),
			(r"/chat", SocketHandler)
		],
		debug = True,
		template_path = os.path.join(os.path.dirname(__file__), "templates"),
        static_path = os.path.join(os.path.dirname(__file__), "static")
	)
	app.listen(8000)
	tornado.ioloop.IOLoop.instance().start()

客户端代码:

<html>
<head>
<script type="text/javascript">
var ws = new WebSocket("ws://localhost:8000/chat");
ws.onmessage = function(event) {
	console.log(event);
}
function send() {
	ws.send(document.getElementById('chat').value );
}
</script>
</head>

<body>
	<div>
		hello
		<input id="chat">
		<button  onclick="send()">send</button>
	</div>	
</body>
</html>


分享到:
评论
1 楼 sanrenxing_1 2017-03-13  
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方便,GoEasy就挺不错的,我昨天试了一下,代码简洁易懂,几分钟我就洗了一个自己的实时推送功能;官网: http://goeasy.io/

相关推荐

Global site tag (gtag.js) - Google Analytics