2011-12-14 13 views
1

私はTwistedで書かれたシンプルな彗星のサーバーを持っています。タイムスタンプを出力します。私は同じ静的ウェブサーバを同じポート上で実行しています。提供されたページ上のjavascriptは、コメットサーバーからタイムスタンプを追加することによってページを更新しようとします。彗星の接続タイムアウト

しかし、コメットサーバーから何も表示されません。 Chromiumのデベロッパーツールを使用すると、長い接続が開かれていることがわかります。しかし、接続がタイムアウトして何もページに追加されません。それはなぜ機能しないのですか?応答が完全にクライアントに配信されるまで、あなたはJavaScriptで応答データを得ることに依存することはできません

from twisted.internet import reactor 
from twisted.internet import task 
from twisted.web import server 
from twisted.web.server import Site 
from twisted.web.resource import Resource 
import time 

class ClockPage(Resource): 
    isLeaf = True 
    def __init__(self): 
     self.presence=[] 
     loopingCall = task.LoopingCall(self._print_time) 
     loopingCall.start(1, False) 
     Resource.__init__(self) 

    def render_GET(self, request): 
    # The browser won't display any output until it's gotten a minimum 
    # number of bytes from the server or something. Hence, junk divs. 
     request.write('''<div class="11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"></div><div class="111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111187348937284789374872387847847811111111111111723872187383738271893789217387389737389711111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"></div>''') 
     request.write('<b>%s</b><br>' % (time.ctime(),)) 
     self.presence.append(request) 
     return server.NOT_DONE_YET 

    def _print_time(self): 
     for p in self.presence: 
      p.write('<b>%s</b><br>' % (time.ctime(),)) 

class UpdatePage(Resource): 
    def render_GET(self, request): 
     return """ 
     <!doctype html> 
<html> 
    <head> 
     <title>Metastatus</title> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js";></script> 

     <script type="text/javascript"> 
function addentry(type, msg) { 
    "use strict"; 
    if (type === "new" && msg !== "") { 
     $("#entries").prepend(
      "<li>" + msg + "</li>" 
     ); 
    } 
} 

function waitForMsg() { 
    "use strict"; 
    $.ajax({ 
     type: "GET", 
     url: "http://localhost:8080/clock", 

     async: true, /* If set to non-async, browser shows page as "Loading.."*/ 
     cache: false, 
     timeout: 50000, /* Timeout in ms */ 

     success: function (data) { /* called when request to barge.php completes */ 
      addentry("new", data); /* Add response to a .msg div (with the "new" class)*/ 
      setTimeout(
       waitForMsg(), /* Request next message */ 
       1000 /* ..after 1 seconds */ 
      ); 
     }, 
     error: function (XMLHttpRequest, textStatus, errorThrown) { 
      addentry("error", textStatus + " (" + errorThrown + ")"); 
      setTimeout(
       waitForMsg(), /* Try again after.. */ 
       "15000" 
      ); /* milliseconds (15seconds) */ 
     } 
    }); 
} 

$(document).ready(function() { 
    "use strict"; 
    waitForMsg(); /* Start the inital request */ 
}); 
    </script> 
    </head> 
    <body> 
     <h1>Example</h1> 
     <ul id="entries"></ul> 
    </body> 
</html>""" 

if __name__ == '__main__': 
    root = Resource() 
    root.putChild('', UpdatePage()) 
    root.putChild('clock', ClockPage()) 
    factory = Site(root) 
    reactor.listenTCP(8080, factory) 
    reactor.run() 

答えて

0

は、ここで自己完結型の例です。この動作はブラウザーによって異なりますので、時々必要に応じて動作し、他の時は動作しません。

また、ブラウザとサーバーの間のHTTPプロキシが原因で、接続が無期限に開いているとは限りません。

+0

私はちょうどtxWSを使ってしまった。彗星ではないが、作業がはるかに簡単だった。 – James