【疑惑】关于TCP/IP Socket传输的疑问

szpublice 2012-03-04 10:00:35
我定义了一个协议,其中使用Integer来表示包的类型,又使用Integer来说明完整的包的长度,然后又有一个Byte()数组来存储传输中的实体数据(长度不固定)

那么这样,假如我现在有一个客户端正在传输文件中,每个包的实体数据1K,加上包的两个Integer类型的头每个占用4Byte,即一个完整的包大约是1024+8字节

如果在传输文件的过程中,这个客户端又向服务器发送了其他的包(不是传输文件的),这个时候是否会导致包混乱,

我们假设这样一种情况:

原本应该是一个完成的包1032个Byte,但由于在传输文件的过程中,客户端又发了其他的消息,这个时候,这条消息是否会被插入到1032Byte的中间?

即:包A的一部份+消息+包A的另一部份

会出现这样的情况吗?
...全文
92 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
szpublice 2012-03-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sp1234 的回复:]

假设只是一个send语句,那么是线程安全的。假设你一个消息分成多次send,那么当然完全可能在并发时混乱。
[/Quote]

好,要的就是这句,一个包SEND一次。
  • 打赏
  • 举报
回复
至于你说的udp、短连接之类的,显然完全不是这回事。对于udp、短连接,根本无所谓什么长度、分隔之类的东西,这些东西毫无用处了。因为根本不可能存在有沾包,根本用不着标记什么长度或者分隔格式。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 szpublice 的回复:]
这也是一种方法,只不过相对来说会麻烦一些,因为你得等,得分析。会复杂些,如果用长度来表示的话……
[/Quote]

我上面少了两个字,“只向前进方式去随时解析出这种xml element而不用等看到结尾再回溯”,少了“前进”两个字。

不是什么xml都向.net的分析器这样去等到结尾才回溯分析的,许多xml分析器根本不回溯、因此完全不用等,看到一个完整的xml element就立刻返回它。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 szpublice 的回复:]
我们假设这样一种情况:

原本应该是一个完成的包1032个Byte,但由于在传输文件的过程中,客户端又发了其他的消息,这个时候,这条消息是否会被插入到1032Byte的中间?

即:包A的一部份+消息+包A的另一部份

会出现这样的情况吗?

意思就是说,例如我先:

Socket.Send(包A)

然后我又Socket……
[/Quote]

假设只是一个send语句,那么是线程安全的。假设你一个消息分成多次send,那么当然完全可能在并发时混乱。
szpublice 2012-03-04
  • 打赏
  • 举报
回复
最近这些年有很多著名的协议都不是这种什么“长度+bytes”的了。例如xmpp人家就是发送一个完整的xml,客户端每一个消息就是一个完整的xml element(因为接收方可以只向方式去随时解析出这种xml element而不用等看到结尾再回溯),当最外层(root)完整发送完就代表着通讯结束了。

这也是一种方法,只不过相对来说会麻烦一些,因为你得等,得分析。会复杂些,如果用长度来表示的话,只要取到前面8个字节,就可以判断这个消息应该要多长。

而你说的通讯的,更多的应该是使用UDP,而不是长连接,长连接的话服务器承受不起吧。
szpublice 2012-03-04
  • 打赏
  • 举报
回复
不是,前辈们没看明白我的意思,

我们假设这样一种情况:

原本应该是一个完成的包1032个Byte,但由于在传输文件的过程中,客户端又发了其他的消息,这个时候,这条消息是否会被插入到1032Byte的中间?

即:包A的一部份+消息+包A的另一部份

会出现这样的情况吗?

意思就是说,例如我先:

Socket.Send(包A)

然后我又Socket.Send(消息A)

这样的话,会不会出现交X的情况?消息A被插入到包A的中间,按理说应该不会,因为TCP包是有顺序的。

先发先到,所以应该是包A完全到达后,后面才接着跟着消息A,这样一来,相当于说,比如我文件分为三个包,分为ABC,我发送包A、消息A、包B、包C
这样的话,到达应该也是这个顺序,

但消息A本身也是一个完整的包。
  • 打赏
  • 举报
回复
再比如说早期的msn等另外一些IM,人家就是类似
A|234|sdsdfgsdf|我是桃花|4.555
这类信息,中间用回车/换行分隔。

你的“协议”主要见一些抄10年前小通讯demo的c程序员所说的东西。
  • 打赏
  • 举报
回复
肯定会出现这样情况啊。tcp为了给网络一个公平的效率,是慢启动、自动沾包的。

最近这些年有很多著名的协议都不是这种什么“长度+bytes”的了。例如xmpp人家就是发送一个完整的xml,客户端每一个消息就是一个完整的xml element(因为接收方可以只向方式去随时解析出这种xml element而不用等看到结尾再回溯),当最外层(root)完整发送完就代表着通讯结束了。
bdmh 2012-03-04
  • 打赏
  • 举报
回复
这需要你指定协议,验证等,每类信息要有包头,这样你才可以对来的信息进行筛选

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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