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()
私はちょうどtxWSを使ってしまった。彗星ではないが、作業がはるかに簡単だった。 – James