2014-05-12 54 views
0

这是基本的web套接字测试:龙卷风:不接受连接

import tornado.httpserver 
import tornado.websocket 
import tornado.ioloop 
import tornado.web 

class WSHandler(tornado.websocket.WebSocketHandler): 
    def open(self): 
     print 'new connection' 
     self.write_message("Hello World") 

    def on_message(self, message): 
     print 'message received %s' % message 

    def on_close(self): 
     print 'connection 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

你想如何决定接受哪一个? – dano

+0

喜欢通过从客户端发送密码 – Mero

+0

嗨梅罗,我已经扩展我的答案,包括一个示例显示的套接字连接的身份验证。你可能想编辑你的问题,但实际上要求:) – aychedee

回答

1

WebSocketHandler实例具有request属性。

所以我会检查self.requestopen方法来决定是否要立即关闭连接,发送一个错误信息,或者添加为以后处理列表中的连接。

喜欢的东西:

class WSHandler(tornado.websocket.WebSocketHandler): 

    connections = [] 

    def open(self): 
     if self.request.remote_ip == '127.0.0.1': 
      self.write_message('go away home') 
      self.close() 
     else: 
      self.write_message('welcome') 
      self.connections.append(self) 

您可以通过reading the tornado source Luke查看所有的检查可用属性。

如果您想要接受或拒绝基于密码的连接,则需要将该逻辑添加到on_message方法中。您还需要保持连接状态。像这样的东西。

class WSHandler(tornado.websocket.WebSocketHandler): 

    users = {'dave': 'password1234'} 

    def open(self): 
     self.authed = False 

    def on_message(self, message): 
     if self.authed: 
      pass # handle already authed messages here 
     else: 
      # authenticate a connection here 
      username, password = message.split(':') 
      if self.users.get(username) == password: 
       self.authed = True 
       self.write_message('Welcome back %s.' % (username,)) 
      else: 
       self.write_message('Auth failed') 

请注意,这不是我真正使用的密码协议。这只是一个例子,展示如何创建一个。