クラスを使用System.Net.Sockets
して C# でゲームのネットワーク部分を記述しようとしています。TcpClient
- 各更新サーバーはクライアントに情報を送信しています。
- すべての情報は 2kb のパケットに組み込まれているため、1 回の更新で 1-2-3-5-10 パケットを送信できます。
- クライアントは情報をチェックしており、情報が正しい形式である場合は、それを読み取ります。
- サーバーがあまりにも多くのパケットを送信しようとし始めるまで、すべてが正常に機能しています。
- クライアントがときどき間違ったデータを含むパケットを受信することがある場合、通常は 20 ~ 50 パケットの 1 つです。
- たとえば、通常、1 回の更新で 1 ~ 2 パケットは正常に受信されますが、更新で 3 ~ 10 個のパケットを受信すると、間違ったデータ ストリームが返されます。
- 一度に複数のクライアントを起動している場合、サーバーから同じデータ ストリームを取得する必要があります。異なる数の成功データ ストリームと失敗データ ストリームが取得されます。
この間違ったデータ ストリームを回避するにはどうすればよいですか?
1 ミリ秒で送信するデータが多すぎて、時間をかけて送信する必要がありますか?
これは送信情報です:
TcpClient client;
public void SendData(byte[] b)
{
//Try to send the data. If an exception is thrown, disconnect the client
try
{
lock (client.GetStream())
{
client.GetStream().BeginWrite(b, 0, b.Length, null, null);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
これは受信情報です。
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);
}
メインネットワークコードです。