2017-10-21 173 views
0

在Web瀏覽器和服務器的早期階段,可以創建將數據發送到瀏覽器的腳本,並且瀏覽器會在它到達時顯示它。如何讓現代瀏覽器在到達時顯示行

例如,傳統的NPH測試腳本:

#!/usr/local/bin/perl 

$server_protocol = $ENV{'SERVER_PROTOCOL'}; 
$server_software = $ENV{'SERVER_SOFTWARE'}; 
$|=1; 

print "$server_protocol 200 OK", "\n"; 
print "Server: $server_software", "\n"; 
print "Content-type: text/plain", "\n\n"; 

print "OK, Here I go. I am going to count from 1 to 5 !", "\n"; 

for ($loop=1; $loop <= 5; $loop++) { 
    print $loop, "\n"; 
    sleep (2); 
} 

print "All Done!", "\n"; 

exit (0); 

回到在舊的Netscape天瀏覽器將顯示1,2,3,4,5,因爲它們到達它們之間2秒。

在現代瀏覽器(如Chrome)中,只有腳本終止並且所有5行都一次顯示,纔會看到任何內容。

我可以看到該腳本按預期工作telnet到服務器並運行手動GET命令;每2秒接收一次輸出。

有無論如何告訴現代瀏覽器(也許通過頭?)來行事舊的方式,並顯示線到達?

回答

0

事實證明,分塊模式可行......但在瀏覽器開始流式傳輸之前,您需要首先發送一堆數據。

介紹塊前的數據,通過試驗來確定:

Using "transfer-encoding: chunked", how much data must be sent before browsers start rendering it?

所以所得到的代碼將是這樣的:

#!/usr/local/bin/perl 

$server_protocol = $ENV{'SERVER_PROTOCOL'}; 
$server_software = $ENV{'SERVER_SOFTWARE'}; 

$|=1; 

print "$server_protocol 200 OK", "\n"; 
print "Server: $server_software", "\n"; 
print "Transfer-Encoding: chunked", "\n"; 
print "Content-type: text/plain", "\n\n"; 

sub chunk { 
    my ($chunk)[email protected]_; 
    printf("%x\n%s\n", length($chunk), $chunk); 
} 

# Send 1K of spaces to convince browsers to display data as it comes 
chunk(" " x 1024); 

chunk("OK, Here I go. I am going to count from 1 to 5 !\r\n"); 

for ($loop=1; $loop <= 5; $loop++) { 
    chunk($loop . "\r\n"); 
    sleep (2); 
} 

chunk("All Done!\r\n"); 

# We need this to tell the client chunking has ended 
chunk(""); 

(由於非SO用戶爲幫我用這個)

相關問題