2011-12-07 43 views
1

我正在嘗試使網絡聊天與其他語言進行集成。 我願意創建我自己的網絡服務器在Java ..只知道迴應一個特定的請求。聊天java web服務器,http部分響應

我有一個監聽端口80應答與

out.print("HTTP/1.1 200 OK\r\n"); 
out.print("Content-Type: text/plain\r\n\r\n"); 

out.println("We have a text now"); 

out.print("\r\n"); 
out.print("\r\n"); 
out.print("0"); 
out.print("\r\n"); 
out.print("\r\n"); 

我的問題是...有沒有辦法使用部分反應,以保持瀏覽器的插口開放套接字?

我想只有當它們存在發送消息。在這種情況下,消息將幾乎立即派出..

PS:我不是在談論網絡插座,因爲不是所有的程序都支持Web的插座。 ..只有瀏覽器做...(程序不支持網絡套接字:Internet Explorer)

我的問題是,如果我可以使用部分響應(206)在這種情況下..以及如何保持頁面「加載「併發送部分文本...... ?? ...我必須說內容長度或什麼?我必須寫什麼頭......我只知道幾種狀態(200,301,404等)。對於206我不知道在第一,第二,第三行寫什麼......如何發送響應(如xml,text,還是我可以定義內容類型?)以及如何從javascript讀取它?

例如,我想這個代碼寫的每一秒的東西:

out.print("HTTP/1.1 200 OK\r\n"); 
out.print("Content-Type: text/plain\r\n\r\n"); 

for (int i = 0; i < 10; i++) 
{ 
    out.println("We have a text now"); 
    try 
    { 
     Thread.sleep(1000); 
    } 
    catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 

} 

out.print("\r\n"); 
out.print("\r\n"); 
out.print("0"); 
out.print("\r\n"); 
out.print("\r\n"); 

問候

+0

'保持瀏覽器的插口打開?'爲什麼你想要這個? – PeterMmm

+0

,因爲我想發送消息時,只有當他們存在..所以..這樣的消息幾乎立即發送.. – Alex

+0

不明白你的問題 –

回答

1

什麼像樣的HTTP客戶端將使用保持HTTP連接,因此,如果用戶再次使得在幾請求秒他們將不需要打開一個新的連接。如果你編寫自己的web服務器,你必須確保實現這個,否則實現將比標準的web服務器或web容器(例如tomcat或jetty)慢。另外,由於許多語言都有很好的http庫,所以你也不需要爲此定製一個Web服務器。

如果你已經編寫了一個servlet,可以簡單地不再從http響應返回,然後在響應出來時寫出響應。這將綁定服務器上的線程,但可能不會很好地擴展。

你可以試試其中一個異步http實現(例如netty或mina),然後去嘗試一下,但這樣做的工作量要大得多 - 儘管它的工作量要比試圖推出自己的工作要少得多。

1

此代碼「保持瀏覽器的插座開」:

out.print("Connection:keep-alive \r\n"); 

但請記住,瀏覽器仍然可能需要投票,以獲得新的文本。

+0

這不是幫助我...我想讓我寫文字..我會更新我的帖子... – Alex

0

不要介意保持活着或其他標題。只需在您的Web服務中等待合理的金額,執行更改檢查和睡眠()。

我在我的PHP代碼中使用了10..20秒的睡眠,並且它工作正常。 (PHP的默認腳本最大執行時間爲30秒,因此它不需要Apache/PHP配置)。另外,我在C/C++服務器代碼中使用了4..5秒的睡眠時間,只是「因爲我可以」,簡單的C++ web服務器響應線程比PHP web服務器線程/進程吃的資源要少得多(不管)。

這種模式只有一個問題:當服務器端發生變化時,您不應該立即迴應,因爲這可能比有更多的,所以您應該等待並收集一些變化爲了在一個答案中報告他們。