2014-05-12 89 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') 

請注意,這不是我真正使用的密碼協議。這只是一個例子,展示如何創建一個。