C# Socket粘包處理講解示例
當(dāng)socket接收到數(shù)據(jù)后,會根據(jù)buffer的大小一點(diǎn)一點(diǎn)的接收數(shù)據(jù),比如:
對方發(fā)來了1M的數(shù)據(jù)量過來,但是,本地的buffer只有1024字節(jié),那就代表socket需要重復(fù)很多次才能真正收完這邏輯上的一整個(gè)消息。
對方發(fā)來了5條2個(gè)字符的消息,本地的buffer(大小1024字節(jié))會將這5條消息全部收入囊下...
那么,如何處理呢?下面我以最簡單的一種文本消息來demo
根據(jù)上面所描述的情況,最重要的關(guān)鍵落在了下面3個(gè)因素的處理上
消息的結(jié)尾標(biāo)記
接收消息時(shí)判斷結(jié)尾標(biāo)記
當(dāng)本次buffer中沒有結(jié)尾標(biāo)記時(shí)怎么處理
我把寫好的核心算法貼出來:
StringBuilder sb = new StringBuilder(); //這個(gè)是用來保存:接收到了的,但是還沒有結(jié)束的消息
public void ReceiveMessage(object state) //這個(gè)函數(shù)會被以線程方式運(yùn)行
{
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; //這個(gè)是指消息結(jié)束符的長度,此處為\r\n
for(int i=0;i<rawMsg.Length;) //遍歷接收到的整個(gè)buffer文本
{
if (i <= rawMsg.Length - rnFixLength)
{
if (rawMsg.Substring(i, rnFixLength) != terminateString)//非消息結(jié)束符,則加入sb
{
sb.Append(rawMsg[i]);
i++;
}
else
{
this.OnNewMessageReceived(sb.ToString());//找到了消息結(jié)束符,觸發(fā)消息接收完成事件
sb.Clear();
i += rnFixLength;
}
}
else
{
sb.Append(rawMsg[i]);
i++;
}
}
}
}
這個(gè)組件的使用方法:
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);
}
相關(guān)文章
Unity使用LineRender實(shí)現(xiàn)簽名效果
這篇文章主要為大家詳細(xì)介紹了Unity使用LineRender實(shí)現(xiàn)簽名效果,制作簽名功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10Unity TextMeshPro實(shí)現(xiàn)富文本超鏈接默認(rèn)字體追加字體
這篇文章主要為大家介紹了Unity TextMeshPro實(shí)現(xiàn)富文本超鏈接默認(rèn)字體追加字體示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01C#將圖片存放到SQL SERVER數(shù)據(jù)庫中的方法
這篇文章主要介紹了C#將圖片存放到SQL SERVER數(shù)據(jù)庫中的方法,以實(shí)例形式較為詳細(xì)的分析了C#保存圖片到SQL Server數(shù)據(jù)庫的具體步驟與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09DevExpress之ChartControl的SeriesTemplate實(shí)例
這篇文章主要介紹了DevExpress之ChartControl的SeriesTemplate用法實(shí)例,實(shí)現(xiàn)了餅狀Series百分比顯示的效果,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10