首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从TcpSocket清空输入流缓冲区

从TcpSocket清空输入流缓冲区
EN

Stack Overflow用户
提问于 2019-03-02 20:45:25
回答 1查看 57关注 0票数 0

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

代码语言:javascript
运行
复制
public void emptyReadBuffer(){
    try {
        while((DataInputStream)inFromServer.read()>=0) {}
    } catch (IOException e) {}
}

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

EN

回答 1

Stack Overflow用户

发布于 2019-03-02 21:17:51

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

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

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

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

如果事实确实是这样,那么你使用“buffer”这个词就是误导。你不知道这些“杂乱的字节”现在在哪里:也许它们仍然卡在路由器的某个地方,或者在横跨大西洋的电缆中间。“只丢弃任何已经到达本地机器的字节”的概念并不能涵盖它。

你真正需要的是一条唯一的消息‘你好,这是会话的开始',然后你的'emptyReadBuffer’方法应该改为:"ignoreAllUntilStartOfSession(String sessionId)“。这是可以做到的,并且将可靠地摆脱前一次会话。

你的代码片段正在尝试做什么,但失败了,最好是这样做:

代码语言:javascript
运行
复制
inFromServer.skip(inFromServer.available());

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54958658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档