2010-12-02 47 views
1

我正在使用Java來實現多線程TCP服務器 - 客戶端應用程序。但是現在我遇到了一個奇怪的問題:當我關閉服務器套接字時,接收器仍然可以連續接收最後發送的數據包。由於套接字讀取的細節是內核問題,我無法弄清楚原因。任何人都可以提供一些指導方針嗎? 在此先感謝! 編輯: 所涉及的代碼很簡單:爲什麼TCP接收器可以在Socket服務器關閉後接收數據?

public void run() { 
    while(runFlag) { 
     //in = socket.getSocketInputStream(); 
     //byte[] buffer = new byte[bufferSize]; 
     try { 
      in.read(buffer); 
      //process the buffer; 
     }catch(IOException e) { 
      // 
     } 
    } 
} 

當關閉服務器套接字,該讀操作將持續地接收分組(每次進入while循環)。

回答

2

如果數據已經存在於客戶端套接字緩衝區(內核級,等待您的應用程序將其讀入用戶空間內存中),則服務器無法阻止其讀取。這就像用蝸牛郵件:一旦你發送它,你無法撤消它。

+0

如果數據已經在* sender's *套接字緩衝區中,它仍然會在FIN之前發送。 – EJP 2010-12-02 06:20:45

+0

'FIN'的含義是什麼? – 2010-12-02 08:44:13

+0

它是一個*單個位*,表示這是此連接的最終數據包。 – EJP 2010-12-02 11:07:19

3

操作系統內部的TCP/IP堆棧是緩衝連接兩端的數據。發送者填充其套接字發送緩衝區,這由設備驅動程序將數據包推送到線路上。接收器從套接字接收緩衝區中的線路中累積數據包,該數據包由應用程序讀取消耗。

0

這就是TCP的工作原理。這是一個可靠的字節流。未交付的數據在正常結束後繼續交付。這不是你想要的嗎?爲什麼這是個問題'?

相關問題