我的程序使用SSL ServerSocket
來等待傳入連接和接收數據。 客戶端連接到服務器,並向Socket
的OutputStream
寫入一個10字節塊的序列。在每個10字節塊後OutputStream
是flush()
ed,因爲塊應該儘快到達服務器(注意:此處使用WIFI)。InputStream緩衝區數據
然後這些塊被服務器讀取。使用OpenJDK 7在Ubuntu Linux上運行服務器可以正常工作。
但在Windows上使用太陽Java 7運行服務器導致以下問題:
我測量了接收到的塊之間的服務器上的時間。我注意到儘管客戶端在寫入數據塊後使用flush()
,但數據有時候太晚被服務器接收/讀取。
例如:
接收第一個塊需要265ms。接下來的15個塊有0ms到16ms的延遲。
之後,下一個塊在172ms後到達。但是下面的10個塊再次只需要0ms到16ms。
所以看起來好像有些字節是由InputStream接收和緩衝的。然後在某個時間點(例如,超過150ms之後),InputStream
的read
-方法返回一些數據。之後,read
-方法立即返回一些字節的數據(0ms到16ms)。然後它又需要一些時間。
我知道一個InputStream
使用緩衝區和read
- 方法塊,直到一個新的字節可用。但似乎read
-方法不會盡可能快地返回數據。
客戶端始終是Android應用程序。但是由於在Linux上運行的服務器不會發生問題(總是在塊之間平均20毫秒),所以問題必須是服務器或JRE。
關於如何解決問題的任何想法?我真的需要客戶端發送的塊的「流動」傳輸,因爲Android應用上的交互應該以接近實時的動畫形式顯示在服務器上。但延遲265毫秒這些動畫卡住了。
好吧,我的意思是,數據被緩衝「某處」...不一定在InputStream中。 :-)在服務器和客戶端上使用'Socket.setTcpNoDelay(true)'解決了這個問題。現在兩塊之間的時間在大多數情況下只能達到16ms。謝謝 – Biggie