TCP/IP显著数据丢失.我发的太多了吗?初级TCP/IP程序员

本文关键字:TCP IP 太多 初级 程序员 数据 | 更新日期: 2023-09-27 18:18:27

我是tcp/ip应用程序的初学者。我正在编写一款游戏,最近我添加了网络多人游戏。我使用System.Net.Sockets中的TcpListener和TcpClient对象来实现联网。当我在本地主机或局域网上测试时,游戏效果很好。后来,我在更远的距离上进行了测试:在我的pc和我的azure VM之间。结果令人震惊。客户端只接收到服务器发送的约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条消息。我的机器有快速可靠的网络连接。我猜windows azure数据中心也应该有良好的连接。如何提高应用程序的网络性能?

编辑:客户端如何接收消息:

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

我刚刚意识到这可能是解释错误,意思是数据收到了,但不知何故被误解了。例如,我还在内部发送一个消息号,它表示已发送消息的总数。cleint接收到的7%的消息可以很好地解释这个数字。但是,服务器接收到的消息中有一些奇怪的数字。例如,我收到消息31、32、33,然后是570425344,然后是35,然后是0。所以我猜字节可能会被偏移。我不知道为什么会这样。

TCP/IP显著数据丢失.我发的太多了吗?初级TCP/IP程序员

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

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

并读取actualReceivedLength以知道您收到了多少,再次调用Read,直到您读取了预期的数量。