Tcp 通信中用Socket发送数据为什么会重复。

weishenmefengshawo 2010-09-19 04:59:16
在程序中用了多线程socket编程,很奇怪在用Socket.send(byte[] data)方法时,会连续发送出两个或者三个data数据。这会不会跟发送缓存有什么关系啊?
...全文
1053 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xu_2007 2010-09-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 weishenmefengshawo 的回复:]
在程序中用了多线程socket编程,很奇怪在用Socket.send(byte[] data)方法时,会连续发送出两个或者三个data数据。这会不会跟发送缓存有什么关系啊?
[/Quote]

这位朋友悟性蛮高的啊,就是你设置应用层缓冲区的问题,比如你设置你的应用层的接收缓冲区大小为:1024,但你现在发送的字节数组为:2048,那么就会接收两次!
足球中国 2010-09-20
  • 打赏
  • 举报
回复
Tcp 通信中用Socket发送数据为什么会重复
tcp的原理就是这个。
还有一个就是你的接收缓存小了。
mooniscrazy 2010-09-20
  • 打赏
  • 举报
回复
加log,确定这个send方法的确只被调用了一次。我觉得应该是代码的问题。跟缓冲区大小没有关系。缓冲区大小仅仅影响性能,不会影响代码的逻辑。
xu_2007 2010-09-20
  • 打赏
  • 举报
回复
1.粘包所至,2。缓冲区定义问题(客户端应用层缓冲区是否定义的比服务端应用层缓冲区大,这样的话你如果按缓冲区大小取字节的话就会出现这种不够则重新把开始的字节补齐的问题)
大黄鸭在发光 2010-09-20
  • 打赏
  • 举报
回复
我觉得应该是程序问题。是不是多线程socket发送造成的。设个全局计数器。socket只发这个计数器内容。发送完后计数器++。
wenbin 2010-09-19
  • 打赏
  • 举报
回复
发送数据data复制一下再发送
weishenmefengshawo 2010-09-19
  • 打赏
  • 举报
回复
up up up
weishenmefengshawo 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangyue4 的回复:]
tcp有粘包的。假如你发的abcde。可能第一次接收到的是ab,然后第二次接收cde。也就是他一次接收的长度不一定,有可能小于你发送的byte[]长度。接收端需要循环接收的。
如果你的代码逻辑没有问题的话根据你的描述应该就是这种可能了
[/Quote]
但现在我的问题是 发一个abc ,客户端收到的是两个abc或者有时三个。从客户端收到数据的情况来看,不像发送了两次或者三次(即不像调用了两三次send()方法),因为这几个abc几乎都是同时收到的。所以我觉得应该是调用了一次send()方法,结果发送了好几个abc
大黄鸭在发光 2010-09-19
  • 打赏
  • 举报
回复
tcp有粘包的。假如你发的abcde。可能第一次接收到的是ab,然后第二次接收cde。也就是他一次接收的长度不一定,有可能小于你发送的byte[]长度。接收端需要循环接收的。
如果你的代码逻辑没有问题的话根据你的描述应该就是这种可能了
weishenmefengshawo 2010-09-19
  • 打赏
  • 举报
回复
望高手们提出各种可能性的解决办法

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧