我需要清空来自TcpSocket连接的输入流的缓冲区。我试过这个:
public void emptyReadBuffer(){
try {
while((DataInputStream)inFromServer.read()>=0) {}
} catch (IOException e) {}
}但它会等待一些输入,直到超时...我只想清空缓冲区,因为我发现有时我会读取以前连接的脏数据。
发布于 2019-03-02 21:17:51
您的代码片段将永远循环,直到发生异常或套接字关闭。
你想要什么是不可能的,这取决于你对“buffer”的定义。
如果你谈论的是本地硬件上的实际缓冲区(比如网卡等等),你可以这样做,尽管java的TCP支持的实际规范并不能保证你能做到这一点。然而,这是没有意义的:新的TCP套接字根本不包含以前连接的零散字节(如果它是,那么这将是一个重大的安全漏洞,所以,是的,人们会关心很多,这将是公共信息)。
所以,我假设你真正的意思是,你有一个长期的TCP连接,用于多个“会话”,并且你仍然从前一个会话中提取字节。
如果事实确实是这样,那么你使用“buffer”这个词就是误导。你不知道这些“杂乱的字节”现在在哪里:也许它们仍然卡在路由器的某个地方,或者在横跨大西洋的电缆中间。“只丢弃任何已经到达本地机器的字节”的概念并不能涵盖它。
你真正需要的是一条唯一的消息‘你好,这是会话的开始',然后你的'emptyReadBuffer’方法应该改为:"ignoreAllUntilStartOfSession(String sessionId)“。这是可以做到的,并且将可靠地摆脱前一次会话。
你的代码片段正在尝试做什么,但失败了,最好是这样做:
inFromServer.skip(inFromServer.available());但正如我所说的,这并不能可靠地完成任何事情。你真的真的不应该这么做。总有一天它会做不到你想要的事情,因为网络是多种多样的,而且不可靠。
https://stackoverflow.com/questions/54958658
复制相似问题