C# TCP/IP严重数据丢失。我寄的太多了吗?初级TCP/IP程序员

C# TCP/IP严重数据丢失。我寄的太多了吗?初级TCP/IP程序员,c#,sockets,networking,tcp,C#,Sockets,Networking,Tcp,我是tcp/ip应用程序的初学者。我正在编写一个游戏,最近我添加了网络多人游戏。我使用System.Net.Sockets中的TcpListener和TcpClient对象来实现联网。当我在本地主机或局域网上进行测试时,游戏效果非常好。后来,我在更远的距离上测试了它:在我的pc和我的azure虚拟机之间。结果令人震惊。客户端只收到服务器发送的约7%的消息。服务器收到84%的邮件。我知道TCP/IP不理解什么是消息,因为它以流的形式发送数据。这就是我认为的一个信息: NetworkStream n

我是tcp/ip应用程序的初学者。我正在编写一个游戏,最近我添加了网络多人游戏。我使用System.Net.Sockets中的TcpListener和TcpClient对象来实现联网。当我在本地主机或局域网上进行测试时,游戏效果非常好。后来,我在更远的距离上测试了它:在我的pc和我的azure虚拟机之间。结果令人震惊。客户端只收到服务器发送的约7%的消息。服务器收到84%的邮件。我知道TCP/IP不理解什么是消息,因为它以流的形式发送数据。这就是我认为的一个信息:

NetworkStream networkStream = ClientSocket.GetStream();
networkStream.Write(_bytes, 0, _bytes.Length); //_bytes is array of bytes
networkStream.Flush();
我的服务器每秒发送20-40条消息,但其中99%的消息长度为10-15字节。客户端每秒发送约4条消息。我的机器可以快速可靠地连接互联网。我想WindowsAzure数据中心也应该有良好的连接。如何提高应用程序的网络性能

编辑:客户端接收消息的方式:

NetworkStream serverStream = ClientSocket.GetStream();
byte[] inStream = new byte[10025];
serverStream.Read(inStream, 0, inStream.Length);

我刚刚意识到这可能是解释错误,也就是说数据被接收到了,但却被曲解了。对于Instance,我还向内部发送了一个消息编号,该编号表示已发送消息的总数。cleint收到的7%的消息可以很好地解释这个数字。然而,服务器收到的消息中有一些奇怪的数字。例如,我收到了消息31,32,33,然后是570425344,然后是35,然后是0。所以我猜字节可能是偏移量。我不知道这是怎么发生的,为什么会发生。

您可能无法在一个数据块中获取所有数据。 使用代码

var actualReceivedLength = serverStream.Read(inStream, 0, inStream.Length);

阅读
Actual ReceivedLength
要知道你收到了多少,请再次调用
read
,直到你读到了预期的内容。

将你发送的数据分块成更大、更少的消息。你基本上无法接收通过TCP发送的数据。你是如何确定93%的损失的@Robert Nagle(默认为on)将为您执行此操作。问题在于您的接收代码,而不是发送代码。显示该代码。@CodeCaster每次我用上述代码发送消息时,我都会将其写入文件。每次我收到一条消息,我就把它写到文件中。我把这些和文件做了比较。让我发布我收到的一段代码…我已经更新了我的帖子,事实恰恰相反。我一块收到的东西太多了。因此,我只处理接收到的一条消息,并丢弃所有其他消息。这就是答案。然而,我可能确实在一个“包”中接收到部分消息,而在下一个“包”中接收到其余消息。丢失如此多数据的主要原因是数据已接收但未经处理。@MaciejSzpakowski-这是因为您假设读取的长度将是发送的实际长度,但情况并非总是如此,这就是为什么您必须检查接收的大小,以便知道是否还有更多数据要读取。