2010-12-02 68 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的工作原理。这是一个可靠的字节流。未交付的数据在正常结束后继续交付。这不是你想要的吗?为什么这是个问题'?