全部。 在我的项目中,我建立了两个websocket连接。一种用于从服务器向客户端发送图片,另一种用于从客户端向服务器发送一些控制数据。现在我只使用一个客户端。
var ws2 = new WebSocket('ws://xx.xx.xx.xx:9002/control')
var ws1 = new WebSocket('ws://xx.xx.xx.xx:9002/data')
ws.binaryType = 'blob'
ws2.onopen =()=> console.log('ws2 connected.')
在服务器端,一旦打开ws1,它将不断地将数据发送到客户端。 q是我从中获取数据的全局队列。这部分工作正常。 问题是我从客户端发送消息后,程序无法在ws2的函数中运行on_message(self,message)。
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render("index.html")
class myWebSocket(tornado.websocket.WebSocketHandler):
def check_origin(self, origin):
return True;
def open(self):
print "websocket1 open."
while self.ws_connection is not None:
print "send..."
try:
self.write_message(q.get(),True)
except tornado.websocket.WebSocketClosedError:
self.close()
def on_message(self, message):
print("websocket1 received message.")
print message
def on_close(self):
print("websocket1 closed.")
class controlWebSocket(tornado.websocket.WebSocketHandler):
def check_origin(self, origin):
return True;
def open(self):
print "websocket2 open"
def on_message(self, message):
print("websocket2 received message.")
print message
def on_close(self):
print("websocket2 closed.")
并且我确定客户端可以通过单击按钮成功发送控制数据。
<script>
function test(){
ws2.send("this is from ws2.")
alert("home clicked.")
}
</script>
并且我还发现,一旦ws1中的打开功能停止,则ws2可以接收到消息。我不明白为什么ws1发送数据导致ws2无法接收数据。
我是python编程和龙卷风websocket的新手。任何人都可以解决这个问题,非常感谢〜!
答案 0 :(得分:0)
龙卷风基于non-blocking concurrency构建。这意味着您通常必须避免阻塞方法(或在线程池中运行它们)。 q.get()
是一种阻止方法,因此在等待消息时,Tornado中的其他任何内容都无法运行。您可能应该将此队列替换为tornado.queues.Queue
。