2013-12-18 30 views
3

問題: 客戶端通過http請求發送。對於那個HTTP請求,我想讓我的龍捲風服務器打開一個到外部服務器的websocket連接,並且獲得一些超時的數據(這些數據我需要存儲在數據庫中)。我還需要能夠處理多個用戶對龍捲風服務器的請求。使用Autobahn/Twisted在Tornado HTTP處理程序中建立websocket連接

這是我實現

from twisted.internet import reactor 
from autobahn.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWS 
from tornado.options import define, options, parse_command_line 

class IndexHandler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    def get(self): 
     self.write("This is your response") 
     factory = WebSocketClientFactory("ws://localhost:7096") 
     factory.protocol = BridgeSocket 
     connectWS(factory) 
     self.finish() 
     reactor.run() 

這是我的Socket連接類:

class BridgeSocket(WebSocketClientProtocol): 

    def sendHello(self): 
     self.sendMessage("rails") 

    def onOpen(self): 
     self.sendHello() 

    def onMessage(self, msg, binary): 
     print "Got echo: " + msg 

    def onClose(wasClean,code,reason): 
     print "GETTING CLOSE CONNECTION" 
     print str(wasClean)+" ---"+str(code)+"---"+str(reason) 
     reactor.stop() 

這裏reactor.run()阻止進一步的http請求到龍捲風的web服務器,所以我嘗試reactor.stop ()一旦websocket工作完成並關閉。但是現在我發現它不可能重啓反應堆。

是否有辦法或任何我可能會丟失任何更好的選擇..

回答

2

如果你想在龍捲風運行從AutobahnPython WebSocket的客戶端,你需要的雙絞線龍捲風集成(「扭曲的龍捲風「) - 見here。這在Tornado內運行一個扭曲的反應堆循環。

+0

謝謝。作品完美。我有另一個問題。我希望我的外部服務器(Tornado)能夠處理多個websocket連接。我在我的外部服務器上的onMessage()中使用self.producer_queue.join(),該服務器阻塞IOLoop並阻止其他連接,直到隊列完成。 – crazydiv

+0

對不起,我不使用龍捲風,所以我不知道。你可能想問一個單獨的問題,只標記「龍捲風」等,所以你得到注意.. – oberstet

相關問題