菜鸟小田 2022-12-26 01:19 采纳率: 40%
浏览 77
已结题

Java Socket 传输数据量大时接收端与发送端数据不一致问题

Java Socket传输字节流时接收端与发送端数据不一致问题
我做的一个TCP传输方法,每次在传输数据时在包头打上数据包大小,在接收端接收到足够大小后再进行处理,在传输数据量小的时候不会出错,但一旦数据量大到几十K时也就是字节数量达到30000时,接收端出现了接受端和发送端发送的字节数量都不一致了,接收端的字节数量时不时会大于发送端,有时多出来几百个字节,有时候多出来几千个字节,更麻烦的是我不知道多出来的字节在哪里,他们插在了这些数据包中间,我在查看发送端和接收端的字节流不同时发现发送端最后几个字节和接收端最后几个字节一致,但接收到的字节数量不一致,我以为是不是发送端在发送时变成了多线程,我尝试调试,可我把断点设置到接收端的InputStream.read时这种现象又离奇的消失了,于是我尝试着在read之前sleep几毫秒,问题也没有出现,但明显这种方法治标不治本且鸡肋,在此


运行结果及详细报错内容

这是发送端运行:

img

最下方是我这个write的数组的大小
可是在接收端:

img

右下角监视的client.getInputStream().available()还有8834,说明缓冲区内还有8834个,可是我已经把发送端发送的数据大小全部读取了,而且读的还是有错误的
可是如果我在前面的

img

read部分加上断点时它就不会有这种情况了

我的解答思路和尝试过的方法,我发现设置断点时它就不会产生这种情况的话,我就在read前面加上sleep也没有产生这种情况,但这种方法很鸡肋,浪费服务器资源不说,如果不同的网络情况我还得调整这个sleep,我猜测产生这个现象的原因是由于发送的write时byte[]数组过大导致发生拆包,但后面的包到达后马上就被read了(可是TCP协议不应该是保证读取有序吗),导致中间空出的字节被覆盖了,后面到达的包就只能排到后面了,可是我没有办法判断我在接受端write的byte[]数组资源全部到达接收端啊。希望能有解我疑惑
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
  • 写回答

5条回答 默认 最新

  • Jackyin0720 2022-12-26 08:25
    关注

    可以看下该实例中对于Java Socket 数据传输 基础以及优化,链接:https://blog.csdn.net/z1766042975/article/details/112709438

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月3日
  • 已采纳回答 12月26日
  • 创建了问题 12月26日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改