我想在C#中使用System.Net.Sockets
和TcpClient
类来编写我的游戏的网络部分。TcpClient缺失数据
- 每个更新服务器正在向客户端发送信息。
- 所有信息都内置到2kb数据包中,因此在1个更新中可以发送1-2-3-5-10个数据包。
- 客户正在检查信息,如果信息有正确的格式 - 然后阅读。
- 一切工作正常,直到服务器开始尝试发送太多的数据包。
- 发生客户端不时发送的数据包通常是20-50数据包的错误数据1。
- 例如,1个更新的1-2个数据包通常会被正常接收,3-10个数据包会导致错误的数据流更新。
- 如果我一次启动多个客户端,应该从服务器获得相同的数据流 - 它们会获得不同数量的成功和失败数据流。
我在做什么错,我该如何逃避这个错误的数据流?
我只是在1毫秒内发送太多的数据,需要随时发送它?
这是发送信息:
这是接收信息:
byte[] readBuffer;
int byfferSize = 2048;
private void StartListening()
{
client.GetStream().BeginRead(readBuffer, 0, bufferSize, StreamReceived, null);
}
private void StreamReceived(IAsyncResult ar)
{
int bytesRead = 0;
try
{
lock (client.GetStream())
{
bytesRead = client.GetStream().EndRead(ar); // просмотр длины сообщения
}
}
catch (Exception ex)
{ MessageBox.Show(ex.Message); }
//An error happened that created bad data
if (bytesRead == 0)
{
Disconnect();
return;
}
//Create the byte array with the number of bytes read
byte[] data = new byte[bytesRead];
//Populate the array
for (int i = 0; i < bytesRead; i++)
data[i] = readBuffer[i];
//Listen for new data
StartListening();
//Call all delegates
if (DataReceived != null)
DataReceived(this, data);
}
它是主网络的代码。
你为什么使用:lock(client.GetStream())??? –
看起来错误的东西(不知道它会导致你的问题,但我怀疑它可能)是对BeginWrite的调用。这是一个ASYNC(非阻塞)调用,所以在写入完成之前释放锁定,可能导致并发问题。尝试用正常的Write()调用替换它。 – Xcelled194
此外,使用Buffer.BlockCopy,而不是一个for循环,从readbuffer获取字节到数据 – Xcelled194