使用python的tornado模块实现websocket同步反馈和接收

最近遇到一个项目需要实现网页根据服务器信息进行自动刷新,既实现服务器既可以接受网页信息调用,服务端也可以根据游戏运行情况实时将数据主动反馈到网页端。但在用tornado.websocket编写的过程中,发现只能在on_message接受信息后才能反馈,或者在open函数里面反馈一次,无法实现我要求的。

1、实时接受网页提交信息

2、根据服务器信息实时反馈。

我找了无数的网页,先想到的是用threading,结果报错:

RuntimeError: There is no current event loop in thread 'Thread-1'.

经过研究发现应该是threading类使用的和tornado架构有冲突,

最后还是吧tornado的手册翻了一遍,终于在角落里发现了线程神器tornado.gen。现在直接上代码

import tornado.websocket
from tornado import gen
class WSResponseScene(tornado.websocket.WebSocketHandler):
    self.thread_flag=True

	@gen.coroutine
	def ResponseThread(self):
			print("start ResponseThread",self.session_key)
			while(self.thread_flag):
                print("run ResponseThread",self.n)
				time.sleep(0.1)
				yield gen.sleep(0)
			print("close ResponseThread",self.session_key)

	def check_origin(self, origin):
		return True
	def open(self):
		self.ResponseThread()
	def on_message(self, message):
		Getmessage = json.loads(message)
	def on_close(self):
		self.thread_flag=False
		print("WebSocket closed")

@gen.coroutine
 def ResponseThread(self):

定义了一个异步线程的函数,其中以 yield gen.sleep(0) 结尾,这样ResponseThread函数和on_message函数就可以同时运行了。

顺便我吧HTML端的代码也个大家付一下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>啊啊</title>
        <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
		<script src="js/jquery.js"></script>
		<script src="js/easeljs.js"></script>
		<script src="js/imagelist.js"></script>

	</head>
	
	<body>
		<input type="text" class="form-control" placeholder="输入" id="InputStr" name="InputStr">
		<button type="submit" class="btn btn-primary" id="BtInputStr">确认</button>
		<button class="btn btn-warning" type="button" id="Btreload">刷新</button>

<script type="text/javascript">
//主要运行函数
sessionStorage.session_key='16471638875475654656'
sessionStorage.user_id='100000'

var ws = new WebSocket('ws://differworld.cn:11003/ResponseScene');
ws.onopen = function()
{
	ws.send('{"authkey":"78bf5e4e-a1e0-11ec-9427-fa163ea9edf6","session_key":10011}');
  // Web Socket 已连接上,使用 send() 方法发送数据
};

ws.onmessage = function (evt)
{
	alert(evt.data);
};
ws.onclose = function()
{
   //$(window).attr('location','http://www.baidu.com');
   //$(location).attr('href', 'http://www.baidu.com');
	// 关闭 websocket
	alert("连接已关闭..."); 
};
		</script>
<script type="text/javascript">
$("#InputStr").val('{"session_key":"1112","user_id":1001,"processor_id":10001,"order_code":"aaaa","order_dict":"aaaa"}');
$(function(){
	$("#BtInputStr").click(function(){
		//alert($("#InputStr").val());
		ws.send($("#InputStr").val());
		
	});	
	$("#Btreload").click(function(){
		window.location.reload();
		return false;
	});
});
</script>
	</body>
</html>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值