C#Socketの接着処理
4304 ワード
SOcketがデータを受信すると、bufferのサイズに応じて少しずつデータを受信します.たとえば、次のようにします.相手から1 Mのデータ量が送られてきましたが、ローカルのbufferは1024バイトしかありません.それはsocketがこの論理的なメッセージ全体を本当に受信するために何度も繰り返す必要があることを意味します. 相手から2文字のメッセージが5つ送られてきて、地元のbuffer(サイズ1024バイト)はこの5つのメッセージをすべてカプセル化します...
では、どうすればいいのでしょうか.次は最も簡単なテキストメッセージでdemoします.
上記の状況によれば,最も重要な鍵は以下の3つの要因の処理にある.メッセージの末尾フラグ メッセージ受信時判定末尾フラグ 今回のbufferに末尾マークがない場合の処理方法 私は書いたコアアルゴリズムを貼り付けました.
このコンポーネントの使用方法:
コンポーネントコードのダウンロード
では、どうすればいいのでしょうか.次は最も簡単なテキストメッセージでdemoします.
上記の状況によれば,最も重要な鍵は以下の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);
}
コンポーネントコードのダウンロード