最近遇到一个项目需要实现网页根据服务器信息进行自动刷新,既实现服务器既可以接受网页信息调用,服务端也可以根据游戏运行情况实时将数据主动反馈到网页端。但在用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>