2

私の Windows サービスでは、データを tcp サーバーにストリーミングする必要があります。グローバルな TcpClient と NetworkStream を宣言し、サービスの開始時にそれらを開始しました。30 秒ごとに、約 30 ~ 40 個の文字列の配列を調べて、TCP サーバーに送信します。

send メソッドは次のようになります。

    private void sendMessage(string message)
    {
            Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
            Globals._stream.Write(data, 0, data.Length);

            if (Globals._responseEnabled)
            {
                data = new Byte[256];
                String responseData = String.Empty;

                Int32 bytes = Globals._stream.Read(data, 0, data.Length);
                responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);

                if (Globals._logStream)
                    Globals._el.writeEventToWindowsLog("Received: " + responseData, "Info");
            }
    }

問題は、30 秒ごとに、すべての文字列が内部で結合された少数のパケットのみが送信されることです。文字列をそれぞれ 1 つのパケットで送信する必要があります。

では、NetworkStream.write メソッドを取得してパケットをすぐに送信するにはどうすればよいでしょうか? send メソッドを呼び出すたびに (毎分約 60 回) 新しい TCPClient と NetworkStream を宣言すると、データは個別に送信されますが、これはあまり良い解決策ではありません。NetworkStream.flush を試しましたが、うまくいきませんでした..

4

1 に答える 1

3

TcpClient のNoDelay プロパティを に設定する必要がありtrueます。

NoDelay が false の場合、TcpClient は、大量の発信データを収集するまで、ネットワーク経由でパケットを送信しません。TCP セグメントのオーバーヘッド量のため、少量のデータの送信は非効率的です。ただし、非常に少量のデータを送信する必要がある場合や、送信する各パケットからの即時の応答が必要な場合があります。

ストリームにラップしているため、ストリームをフラッシュしてすぐに送信する必要がある場合があります。

于 2012-10-05T16:25:31.973 に答える