2013-07-12 108 views
0

我已經編寫了龍捲風代碼,連接到推送無限數據流,處理數據流並將其發送到websocket服務器上的服務器。 問題是,我實現它的方式服務器成爲封鎖在一個特定的功能,並不接受更多的客戶,因爲它永遠不會退出數據提供給websocket的功能。我希望與服務器的連接和從其中檢索的數據只處理一次,但將處理後的數據發送到連接到我的龍捲風服務器的所有客戶端。有人可以幫助我,我無法想出辦法。這裏是我的代碼與數據的處理,去除:龍捲風服務器陷入循環,不接受客戶端

import socket 
import ssl 
import tornado.httpserver 
import tornado.websocket 
import tornado.ioloop 
import tornado.web 

websockets = [] 

class WSHandler(tornado.websocket.WebSocketHandler): 


    def readData(self): 
    while True: 
     line = self.ssl_sock.read() 

     #PROCESS THE READ LINE AND CONVERT INTO RESULTING DATA 


     if(toSend): 
       self.write_message(result) 

    def makeConnection(self): 
     self.ssl_sock.connect(self.address) 
     self.readData() 



    def open(self): 
    print 'New connection was opened' 
    self.s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.ssl_sock=ssl.wrap_socket(self.s, cert_reqs=ssl.CERT_NONE) 
    self.address=('SERVER_ADDRESS',5000) 
    self.nodes=[] 
    self.edges=[] 
    if self not in websockets: 
     print ('added') 
     websockets.append(self) 

    if(len(websockets)==1): 
     print('executing make conn') 
     self.makeConnection() 
    else: 
     self.readData() 
     print('executing read data') 


    def on_message(self, message): 
    print 'Incoming message:', message 
    self.write_message("You said: " + message) 

    def on_close(self): 
    print 'Connection was closed...' 


application = tornado.web.Application([ 
    (r'/ws', WSHandler), 
]) 

if __name__ == "__main__": 

    http_server = tornado.httpserver.HTTPServer(application) 
    http_server.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 
+0

我讀了你發送的例子。我不完全明白。這傢伙如何連接到API並獲取數據? – SinnerShanky

+0

他將所有已連接的客戶端存儲在'cl'列表中。每當調用'api'方法時,他可以在那裏處理數據,然後遍歷所有連接到服務器'cl'的客戶端,並向所有客戶端發送響應,這正是您想要實現的目標? – dm03514

+2

我明白了。在我的情況下,我連接到我的TLS服務器,該服務器不斷髮出通過此webSocket處理程序處理併發送出去的數據流。在我的情況下,我應該如何調用無阻塞地讀取和處理數據而不阻塞服務器的函數? – SinnerShanky

回答

0

龍捲風是一個異步的框架,那就是所有的IO必須在其事件循環中運行,否則整個服務器卡住。

試試看看Tornado Async Client