来自TcpSocket的空输入流缓冲区

问题描述 投票:0回答:1

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

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

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

java sockets tcpclient
1个回答
0
投票

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

根据您对“缓冲区”的定义,您想要的是不可能的。

如果你在谈论本地硬件上的实际缓冲区(那么,网卡等),你可以这样做,虽然java的TCP支持的实际规范并不能保证你能做到这一点。然而,这是毫无意义的:一个新的TCP套接字根本不会保留以前连接的杂散字节(如果它是,那将是一个主要的安全漏洞,所以,是的,人们会关心,很多,它是公共信息)。

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

如果后者确实发生了什么,那么使用“缓冲区”这个词会产生误导。你不知道那些'流浪字节'现在是什么:也许它们仍然被卡在路由器的某个地方,或者在大西洋的电缆中间。 “只丢掉任何到达本地机器的字节”的概念就不会覆盖它。

你真正需要的是一个独特的消息,就像'你好,这是会话的开始',然后你的'emptyReadBuffer'方法应该改为:“ignoreAllUntilStartOfSession(String sessionId)”。这可以做到,并将可靠地摆脱前一个会话。

你的代码片段尝试做什么和失败最好是这样做的:

inFromServer.skip(inFromServer.available());

但正如我所说,这并没有可靠地完成任何事情。你真的,真的不应该这样做。由于网络变化多端且不可靠,它有可能无法做到你想要的一天。

© www.soinside.com 2019 - 2024. All rights reserved.