2013-09-10 6 views
0

Я хочу запустить веб-сервер и файл флэш-файла на порту 80 с помощью Tornado. Причина того, что вы не хотите запускать сервер на порту 843 по умолчанию, заключается в том, что он часто закрывается в корпоративных сетях. Можно ли это сделать, и если да, то как мне это сделать?Tornado: запуск сервера websocket и флэш-политики на порту 80

Я пробовал следующую структуру, которая, похоже, не работает: соединение с websocket работает, но запрос файла политики не перенаправляется на TCPHandler.

#!/usr/bin/python 

import tornado.httpserver 
import tornado.ioloop 
import tornado.web 
import tornado.websocket 
import tornado.gen 
from tornado.options import define, options 

from tornado.tcpserver import TCPServer 


define("port", default=80, help="run on the given port", type=int) 

class FlashPolicyServer(TCPServer): 

    def handle_stream(self, stream, address): 
     self._stream = stream 
     self._read_line() 

    def _read_line(self): 
     self._stream.read_until('\n', self._handle_read) 

    def _handle_read(self, data): 
     policyFile = "" 
     self._stream.write(policyFile) 
     self._read_line() 


class WebSocketHandler(tornado.websocket.WebSocketHandler): 

    def open(self): 
     pass 

    def on_message(self, message): 
     pass 

    def on_close(self): 
     pass 


def main(): 
    tornado.options.parse_command_line() 
    mainLoop = tornado.ioloop.IOLoop.instance() 

    app = tornado.web.Application(
     handlers=[ 
      (r"/websocket", WebSocketHandler), 
      (r"/", FlashPolicyServer) 
     ], main_loop=mainLoop 
    ) 

    httpServer = tornado.httpserver.HTTPServer(app) 
    httpServer.listen(options.port) 

    mainLoop.start() 

if __name__ == "__main__": 
    main() 

Любые идеи? Если это невозможно, может ли другая идея обслуживать файл политики через порт 443?

ответ

0

Есть две проблемы с вашим подходом:

  1. TCPServer используется следующим образом:.

    сервер = TCPServer() server.listen (6666) IOLoop.instance() запускается ()

    Это сделало бы трюк после удаления линии (r"/", FlashPolicyServer).

    Но вы хотите использовать порт 80.

  2. Однако, вы не можете сделать это, потому что вы должны иметь другой HTTP-сервер на этом порту.

Так что вы можете сделать, это использовать nginx и настроить порт 80 в качестве обратного прокси-серверов для /websocket, служит файл флэш политики в противном случае.

0

Я решил это, обезьяны-заплат IOStream и HTTPServer:

def prepend_to_buffer(self, chunk): 
    self._read_buffer.appendleft(chunk) 
    self._read_buffer_size += len(chunk) 
    if self._read_buffer_size >= self.max_buffer_size: 
     logging.error("Reached maximum read buffer size") 
     self.close() 
     raise IOError("Reached maximum read buffer size") 
    return len(chunk) 

def first_data_handler(self, data): 
    if data == '<policy-file-request/>\0': 
     self.stream.write(policy_file + '\0') 
    else: 
     self.stream.prepend_to_buffer(data) 
     tornado.httpserver.HTTPConnection(self.stream, self.address, self.request_callback,self.no_keep_alive, self.xheaders) 

def handle_stream(self, stream, address): 
    self.stream = stream 
    self.address = address 
    self.stream.read_bytes(23, self.first_data_handler) 

tornado.iostream.IOStream.prepend_to_buffer = prepend_to_buffer 
tornado.httpserver.HTTPServer.first_data_handler = first_data_handler 
tornado.httpserver.HTTPServer.handle_stream = handle_stream 
Смежные вопросы