C#Socket接着処理の説明例

2459 ワード

SOcketがデータを受信すると、bufferのサイズに応じて少しずつデータを受信します.たとえば、次のようにします.
相手から1 Mのデータ量が送られてきたが、ローカルのbufferは1024バイトしかなく、socketがこの論理的なメッセージ全体を本当に受信するには何度も繰り返す必要があることを意味している.相手から2文字のメッセージが5つ送られてきて、地元のbuffer(サイズ1024バイト)はこの5つのメッセージをすべてカプセル化します...では、どうすればいいのでしょうか.次は最も簡単なテキストメッセージでdemoします.
上記の状況によれば,最も重要な鍵は以下の3つの要因の処理にある.
メッセージのエンドタグメッセージを受信すると、エンドタグが今回のbufferにエンドタグがない場合、私が書いたコアアルゴリズムをどのように処理するかを判断します.
 
  
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                {
                    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);
        }