C〓Socket粘着パックの説明例


socketがデータを受信すると、ブザーのサイズによって少しずつデータを受信します。
相手から1 Mのデータ量が送られてきましたが、ローカルのブザーは1024バイトしかないです。それはsocketを表しています。この論理的なメッセージ全体を本当に収めるには何回も繰り返す必要があります。相手から5つの2つの文字のメッセージが送られてきました。ローカルのブザー(サイズ1024バイト)はこの5つのメッセージを全部袋に入れます。どう処理しますか?以下は一番簡単なテキストメッセージでデモに来ます。
上に述べた状況によって、最も重要な鍵は次の3つの要素の処理に落ちています。
メッセージの最後のマークはメッセージを受信した時、最後のマークを判断します。今回のブザーには最後のマークがない場合、どう処理すればいいですか?書いたコアアルゴリズムを貼り付けます。

StringBuilder sb = new StringBuilder();             // : ,
        public void ReceiveMessage(object state)            //
        {
            Socket socket = (Socket)state;
            while(true)
            {
                byte[] buffer = new byte[receiveBufferSize];  //buffer , 1024
                int receivedSize=socket.Receive(buffer);

                string rawMsg=System.Text.Encoding.Default.GetString(buffer, 0, receivedSize);
                int rnFixLength = terminateString.Length;   // , \r

                for(int i=0;i<rawMsg.Length;)               // buffer
                {
                    if (i <= rawMsg.Length - rnFixLength)
                    {
                        if (rawMsg.Substring(i, rnFixLength) != terminateString)// , sb
                        {
                            sb.Append(rawMsg[i]);
                            i++;
                        }
                        else
                        {
                            this.OnNewMessageReceived(sb.ToString());// ,
                            sb.Clear();
                            i += rnFixLength;
                        }  
                    }
                    else
                    {
                        sb.Append(rawMsg[i]);
                        i++;
                    }
                }
            }
        }

このコンポーネントの使い方:

A2DTcpClient client = new A2DTcpClient("127.0.0.1", 5000);
            client.NewMessageReceived += new MessageReceived(client_NewMessageReceived);
            client.Connect();
            client.Send("HELLO");
            client.Close();

 

        static void client_NewMessageReceived(string msg)
        {
            Console.WriteLine(msg);
        }