3

このコードを使用して:

Java サーバー側:

...
out = new PrintWriter(this.client.getOutputStream(), true);
...
public void sendMsg(String msg) {
    out.println(msg);
    //out.flush(); // we don't flush manually because there is auto flush true
}

C# クライアント側:

    while(connected) {
        int lData = myStream.Read(myBuffer, 0, client.ReceiveBufferSize);
        String myString = Encoding.UTF8.GetString(myBuffer);
        myString = myString.Substring(0, lData);
        myString = myString.Substring(0, myString.Length-2);
        addToQueue(myString);
    }

変数 myString には、サーバーが次のように1つずつ送信する必要がある多くのメッセージがあります

hello \r\t hello \r\t ...

彼らは別々に来る必要があります

hello \r\t
hello \r\t ...

つまり、1 つずつ待つと、すぐにすべてが一列に並んでいます。どうすれば、1 つずつ別々のフラッシュで送信することができますか。

注: 1 秒間 (1 秒) に 30~ 個のメッセージを続けて送信しています。

4

1 に答える 1

2

TCPはバイトのストリームをサポートします。これは、データの送信方法に関係なく、データの到着方法を制御できないことを意味します。(バイト単位で表示される場合を除く)特定の方法で送信されることに依存している場合は、プロトコルを再考する必要があります。

データのバンチングの量を減らすことはできますが、これはスループットを犠牲にしてレイテンシーを減らすことであり、決して信頼されるべきではありません。これらを変更できる場合は、Nagleをオフにし、TCPドライバーのco-alessing設定を減らすことで、これを減らすことができます(ただし、なくすことはできません)。

私はそれらを別々にしたい。

あなたはそれを望むことができますが、TCPはあなたが望むようにメッセージをサポートしていません。


あなたの場合の解決策は、あなたの読者があなたの作家のプロトコルと一致することです。行を送信するので、一度に行を読み取る必要があります(例:BufferedReader.readLine())。バッファー内にあるデータのブロックではありません。

于 2013-01-01T17:30:34.757 に答える