2

ソケット (a/sync) 経由で byte[] データを送信しているときに、messagereceived イベントの不一致データを取得しています。たとえば、このように

クライアント:

2013-05-20 12:03:09.6929|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:09.8619|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:10.0249|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:10.1899|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:10.3459|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:10.5220|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:10.6890|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:10.8630|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:11.0490|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:11.2040|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:11.3680|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:11.5340|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:11.7030|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:11.8600|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!
2013-05-20 12:03:12.0340|DEBUG|Tcp|SendAsync_Completed: Sent ( ; T A , 59 84 65 13 10  ) to 127.0.0.1:10002 (Table)!

サーバ:

2013-05-20 12:03:09.6819|DEBUG|Table|TableServer.Cmd = ; T A
2013-05-20 12:03:09.8959|DEBUG|Table|TableServer.Cmd = ; T A ; T
2013-05-20 12:03:10.0799|DEBUG|Table|TableServer.Cmd = A ; T A
2013-05-20 12:03:10.2569|DEBUG|Table|TableServer.Cmd = ; T A
2013-05-20 12:03:10.4750|DEBUG|Table|TableServer.Cmd = ; T A
2013-05-20 12:03:10.6600|DEBUG|Table|TableServer.Cmd = ; T A
2013-05-20 12:03:10.8830|DEBUG|Table|TableServer.Cmd = ; T A ; T
2013-05-20 12:03:11.0790|DEBUG|Table|TableServer.Cmd = A ; T A
2013-05-20 12:03:11.2700|DEBUG|Table|TableServer.Cmd = ; T A
2013-05-20 12:03:11.5090|DEBUG|Table|TableServer.Cmd = ; T A
2013-05-20 12:03:11.7120|DEBUG|Table|TableServer.Cmd = ; T A ; T
2013-05-20 12:03:11.9180|DEBUG|Table|TableServer.Cmd = A ; T A
2013-05-20 12:03:12.1000|DEBUG|Table|TableServer.Cmd = ; T A

私はすべてを試しました。非同期から同期送信に切り替え、送信前にスレッドをスリープさせますが、何も機能しません...

4

1 に答える 1

3

http://tiny.cc/io、特に「ネットワーク パケット: 送信するものは (通常) 取得するものではない」を参照してください。次のように書くことを期待しているようです:

var blob = new byte[] {59,84,65,13,10};
for(int i = 0 ; i < 10 ; i++)
    network.Write(blob, 0, blob.Length);

そして、それを 5 の 10 ブロックとして読み取らせます。しかし、それは単純に機能しません。TCP はストリームです。を呼び出すとRead、「いくつかのデータ、少なくとも 1 バイトまたは EOF、最大 {count} バイト」が取得されます。プロトコルは、送信コードがどのように構成されているかを知りませんし、知ることもできません。ソースでバッファリングされているかどうかは不明です。パケットは結合および分割できます。保証されているのは、同じバイトを同じ順序で取得することだけです。ただし、必ずしも同じチャンクにあるとは限りません。

基本的に、メッセージを分離するのはあなたの仕事です。13この場合、 ,のセンチネル値を読み取ることでそれを実行できるようです10。最も基本的なレベルでは、次のようになります。

    byte[] ReadToNewline()
    {
        var ms = new MemoryStream();
        int val;
        do
        {
            val = netStream.ReadByte();
            if (val < 0) throw EOF();
            if (val == '\r')
            {
                val = netStream.ReadByte();
                if (val == '\n') return ms.ToArray();
                throw new InvalidOperationException("Expected end-of-line");
            }
            ms.WriteByte((byte)val);
        } while (true);
    }

より洗練されたソリューションが可能です。SimpleRedisから単純に取得しました。より大きなバッファをローカルで読み取り、CR/LF のペアを探して受信バッファをループすることを好む場合があります。CR は 1 つの「読み取り」の最後にあり、LF は別の読み取りの開始にある可能性があることに注意してください。

于 2013-05-20T10:56:21.777 に答える