2013-07-12 61 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