2017-05-09 16 views
-1

キープアライブセッション中に同じ応答でhtmlコンテンツ(少し遅れている)の後にデータを送信していて、応答全体がダウンロードされる前にブラウザにhtmlを表示します。完全にダウンロードされる前にhtmlページを表示する方法

例えば、私はテキスト'hello, 'と遅延を持つ'world'を計算する関数(1秒とする)を持っています。だから私はすぐに'hello, 'と遅れて'world'を表示するブラウザをしたい。 (:https://pastebin.com/muUJyR36強調表示):

import socket 
from time import sleep 

sock = socket.socket() 
sock.bind(('', 9090)) 
sock.listen(1) 
conn, addr = sock.accept() 

def give_me_a_world(): 
    sleep(1) 
    return b'world' 

while True: 
    data = conn.recv(1024) 
    response = b'HTTP/1.1 200 OK\r\n'\ 
       b'Content-Length: 12\r\n'\ 
       b'Connection: keep-alive\r\n'\ 
       b'\r\n'\ 
       b'hello, ' 

    conn.send(response) # send first part 
    conn.send(give_me_a_world()) # make a delay and send other part 

conn.close() 
+0

あなたが試したことを説明してください。また、データを送信する方法も「あいまい」です。 – aaaaaa

+0

'keep-alive'はこの問題とは何の関係もなく、HTTPではなくTCPレベルに基づいています。 – shaochuancs

+0

ウェブソケットを試してみませんか? –

答えて

0

まず第一に、なぜ、どこを理解するためにHow the web works: HTTP and CGI explainedを読んで、それは

ここ

は私が何をすべきかの例のPythonコードである(アヤックスせず、そう)1つのリクエスト内で可能です現在のコードはHTTPに違反しているため、動作しないため、動作してはいけません。今

Is Content-Length or Transfer-Encoding is mandatory in a response when it has bodyごとに、違反を固定した後、あなたは

  • Content-Lengthヘッダを省略しなければならないし、すべてのデータを送信した後にソケットを閉じ、OR
  • 送信するデータ全体の長さを計算事前に、あなたがTransfer-Encoding: chunkedを使用してContent-Lengthを省略することができContent-Lengthヘッダ
0

でそれを指定します。

curlのようなテキストブラウザでうまくいきます。リンクWWWブラウザ。しかし、現代のグラフィカルブラウザは、何らかのバッファ境界に達するまで、実際にレンダリングを開始しません。

import socket 
from time import sleep 

sock = socket.socket() 
sock.bind(('', 9090)) 
sock.listen(1) 
conn, addr = sock.accept() 

def give_me_a_world(): 
    sleep(1) 
    return b'5\r\n'\ 
      b'world\r\n'\ 
      b'0\r\n'\ 
      b'\r\n' 

while True: 
    data = conn.recv(1024) 
    response = b'HTTP/1.1 200 OK\r\n'\ 
       b'Transfer-Encoding: chunked\r\n'\ 
       b'Connection: keep-alive\r\n'\ 
       b'\r\n'\ 
       b'7\r\n'\ 
       b'hello, \r\n' 

    conn.send(response) # send first part 
    conn.send(give_me_a_world()) # make a delay and send other part 

conn.close() 
関連する問題