2011-06-29 27 views
4

考慮下面的情況,一個servlet已經用Java編寫,一旦你連接到servlet,它就開始寫入OutputStream,比如說1000萬字節,每次1個字節。爲什麼流中的「Close」調用在C#和Java中的行爲有所不同?

您有一個客戶端程序,它讀取servlet的響應流並讀取100個字節並調用close。現在,如果您的客戶端程序使用Java,則流會立即關閉,服務器將停止發送內容,但如果客戶端程序使用C#,則close調用需要很長時間才能完成,因爲它顯然等待服務器完成寫入所有內容1000萬字節。

所以,我對這個兩個問題,

  1. 爲什麼C#行爲不同?
  2. 我該怎麼做才能確保C#流上的Close調用立即關閉流,並且不允許服務器繼續發送數據?

任何指針將不勝感激:-)

+0

(刪除了只適用於**服務器**調用'Close()'的答案;因爲它是調用Close()的*客戶端*,所以這是不同的) –

+0

Java和C#doesn關閉套接字似乎不一樣。也許你的C#代碼有bug,應該在這裏發佈。 – irreputable

+0

'爲什麼C#和Java中的流上的「Close」調用行爲不同?'因爲它們是兩個完全獨立的系統和框架,並且從來沒有人聲稱它們以相同的方式工作。但要回答你的問題,你需要向我們展示一些代碼。 – Bobby

回答

0

所以,我終於在幾個星期後發現了這一點,並與微軟進行了驗證。 C#和Java之間的區別在於,在Java關閉調用中關閉請求/連接的同時,在C#中,它不會發生,除非您使用xxxRequest.Abort()調用進行跟蹤。希望這可以幫助別人。

3

我假設某種這裏的插座。我懷疑Java實現只是簡單地關閉客戶端套接字,可能導致服務器出錯,而C#版本對服務器略微更友好,並等待它確認關閉請求。由於服務器正忙於發送數據,因此它不會收到 - 或者至少不處理 - 關閉請求,直到完成發送。

想想這樣:有人在你的前門試圖向你推銷某些東西,不會被打斷。你可以立即關閉他們的門,或者你可以等到他們說完之後再讓他們離開。

爲了解決這個問題,也許你可以創建一個工作線程來打開流,等待100個字節,然後關閉。與此同時,當線程最終關閉時,你的程序可以做任何它需要做的事情。

+0

謝謝Geoff,我發現如果我在關閉流之前中止請求,服務器意識到它不應該發送更多的數據,我會追求這一點,並讓你張貼。我想在Java中,Abort和Close請求會一起發送出去。 – r00k

相關問題