C〓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);
}