C# (Unity スクリプト) には、TcpClient を使用してデータを送受信するクライアントがあります。クライアントは、「フレーム」ごとに固定のデータ文字列をサーバーに送信します。サーバーは同じ文字列をエコー バックします。これは、テストとシミュレーションを目的としています。
Async メソッドの BeginWrite と BeginReceive を使用します。データは、以下を使用してクライアントによって送信されます。
stream.BeginWrite(data, 0, data.Length, new AsyncCallback(EndTCPSend), null);
そして、次の呼び出しを使用してデータを受信します。
TCPClient.GetStream().BeginRead(TCPBuffer, 0, 1024, new AsyncCallback(OnMessageTCP), null);
現在、問題は、送信用のメソッドを呼び出すコードがまだ呼び出されているにもかかわらず、短時間 (1 秒程度) 後にクライアントがサーバーへのデータの送信を停止することです (ログ出力と Wireshark で確認)。 . データが送信されないため、サーバーでデータが受信されなくなります。
次のコードは、TcpClient を初期化するために使用されます。
TCPClient = new TcpClient();
TCPClient.NoDelay = true;
TCPClient.Connect(remoteEndPoint);
if (TCPClient.GetStream().CanRead)
{
TCPClient.GetStream().BeginRead(TCPBuffer, 0, 1024, new AsyncCallback(OnMessageTCP), null);
}
フレームごとに、次のコードを使用して文字列の送信を開始します。
NetworkStream stream = TCPClient.GetStream();
if (stream.CanWrite)
{
byte[] data = Encoding.UTF8.GetBytes(msg);
stream.BeginWrite(data, 0, data.Length, new AsyncCallback(EndTCPSend), null);
}
そして、次のメソッドを使用して非同期送信を閉じます。
private void EndTCPSend(IAsyncResult result)
{
TCPClient.GetStream().EndWrite(result);
}
データを受信するには、次のメソッドをコールバックとして使用します。
private void OnMessageTCP(IAsyncResult result)
{
NetworkStream stream = TCPClient.GetStream();
int read = stream.EndRead(result);
if (read == 0)
{
return;
}
string message = Encoding.UTF8.GetString(TCPBuffer, 0, read);
TCPMessageBuffer += message; // <-- This line seems to cause the problem.
stream.BeginRead(TCPBuffer, 0, 1024, new AsyncCallback(OnMessageTCP), null);
}
私がここで間違っていることを誰か知っていますか?クライアントが送信を停止する理由は何ですか? そのように非同期でデータを送受信できますか?
前もって感謝します!