首页 > 解决方案 > 来自 TcpSocket 的空输入流缓冲区

问题描述

我需要从 TcpSocket 连接清空输入流的缓冲区。我试过这个:

public void emptyReadBuffer(){
    try {
        while((DataInputStream)inFromServer.read()>=0) {}
    } catch (IOException e) {}
}

但它会等待一些输入,直到超时......我只想清空缓冲区,因为我发现有时我会为之前的连接读取脏数据。

标签: javasocketstcpclient

解决方案


您的代码片段将永远循环,直到发生异常或套接字关闭。

你想要什么是不可能的,这取决于你对“缓冲区”的定义。

如果您谈论的是本地硬件上的实际缓冲区(例如,网卡等),您可以这样做,尽管 java 的 TCP 支持的实际规范并不能完全保证您可以做到。然而,这是没有意义的:一个新的 TCP 套接字根本不保存来自先前连接的杂散字节(如果是这样,那将是一个重大的安全漏洞,所以,是的,人们会非常关心,这将是公共信息)。

所以,我假设你真正的意思是你有一个用于多个“会话”的长期存在的 TCP 连接,并且你仍在从上一个会话中获取字节。

如果后者确实发生了,那么您对“缓冲区”一词的使用具有误导性。您现在不知道这些“杂散字节”在哪里:也许它们仍然卡在路由器的某个地方,或者在横跨大西洋的电缆中间。“只丢弃到达本地机器的任何字节”的概念不会涵盖它。

您真正需要的是一条独特的消息,类似于“您好,这是会话的开始”,然后您的“emptyReadBuffer”方法应该改为:“ignoreAllUntilStartOfSession(String sessionId)”。可以做到这一点,并且可以可靠地摆脱上一个会话。

您的代码段试图做的和失败的事情最好像这样完成:

inFromServer.skip(inFromServer.available());

但正如我所说,这并不能可靠地完成任何事情。你真的,真的不应该这样做。有一天它不会做你想做的事,因为网络多种多样且不可靠。


推荐阅读