连续发送三个或更多数据包时遇到问题

时间:2011-06-13 00:31:51

标签: c# .net sockets tcpclient networkstream

我正在尝试使用TCpClient实现客户端/服务器模型,其Networkstream.Write()/Read()函数发送/接收字节数组。

它大部分时间都有效,除非我尝试连续发送三个或更多字节数组。客户端表示它会全部发送,但服务器只接收前两个。

以下是我用来从客户端写入服务器的代码。

byte[] buffer = p.toByteArray(level);

stream.Write(buffer, 0, buffer.Length);
stream.Flush();

它是在巩固它们还是什么?我只是不明白当我发送2时服务器如何接收不同的数组,但不是3或更多。如果我将3个写入分开,它可以正常工作,但我真的不想这样做。

非常感谢任何帮助。

修改

已解决:) 谢谢你们所有人的帮助。它一次推送2-3个数据包,我的系统认为1个突发= 1个数据包。我刚用TCPClient重写了我现有的架构来检测多个数据包:)再次感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在进行套接字编程时,有一个非常重要的核心规则很重要:

无法保证在X中发送的任何客户端写入,服务器将完全接收相同数量的读取。它可以是客户端上的一个写入和服务器上的10个读取。它可以是10次写入和客户端,只需在服务器上读取一次。

假设客户端发送3条消息,每条消息100个字节。服务器可能会收到150个字节,然后再收到150个字节或100字节和200字节。

如果您使用TCP,唯一可以保证的是订单将被保留,换句话说,您首先发送的任何内容都将首先到达服务器。

您可以使用以下基本技术之一来分隔数据:

  • 标记(用于分隔消息的某种字节序列)
  • 每条消息的长度不变
  • 邮件标题中的长度
  • 以上
  • 的组合