1

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);
}

私がここで間違っていることを誰か知っていますか?クライアントが送信を停止する理由は何ですか? そのように非同期でデータを送受信できますか?

前もって感謝します!

4

0 に答える 0