從上一章的通訊中,我們發現如果使用Tcp連續發送消息會出現消息一起發送過來的情況,這樣給我們編程造成一定的問題,給我們的信息解析造成一定的問題。那麼這篇文章就將針對以上問題給出解決方案......
問題一般會出現的情況如下,假設我們連續發送兩條兩天記錄("我是liger_zql"):
模擬發送示例:
測試消息發送,並匹配協議= ( i = ; i < ; i++= MessageProtocol(, i +
1.(1)我是liger_zql(2)我是liger_zql
2.(1)我是liger_zql我是(2)liger_zql
3.(1)我是liger_zql我是liger_zql
通過以上三種情況,顯然2、3都不是我們想要的結果。那麼如何處理這中情況呢?
解決方案:通過自定義協議...
我們可以以將信息以xml的格式發送出去,列入<protocol>content</protocol>通過正則匹配信息是否完整,如果不完整,我們可以先將本次接受信息緩存接受下一次信息,再次匹配得到相應的結果。
將信息對象轉換成一定格式的xml字符串:
Content { ; ; } MessageInfo(.Content = String.Format(, Address { ; ; } Port { ; ; } RequestMode Mode { ; ; } FileObject FileObject { ; ; } .Mode =.FileObject = RequestFile( address, .Address =.Port =.Mode =.FileObject = RequestFile( address, port, RequestMode mode, filename, filelength, packetsize, .Address =.Port =.Mode =.FileObject = = MessageType MessageType { ; MessageInfo MessageInfo { ; RequestFile RequestFile { ; MessageProtocol(== == MessageProtocol( address, == = (MessageType == Encoding.UTF8.GetBytes(
對接收的信息通過正則進行匹配處理:
temp = List<MessageProtocol> HandlerString(<MessageProtocol> msgProList = List<MessageProtocol> (!= temp + pattern = match = Regex.Match(msg, pattern).Groups[ = msg = (!=
然後將該定義的協議換換成信息對象,通過對象獲取自己想要的信息。
MessageProtocol HandlerObject(= == root.SelectSingleNode(= (root.Attributes[].Value ==== MessageInfo(msgnode.Attributes[== (RequestMode)Enum.Parse((RequestMode), msgnode.Attributes[= = msgnode.Attributes[= Convert.ToInt64(msgnode.Attributes[= Convert.ToInt32(msgnode.Attributes[= Convert.ToInt64(msgnode.Attributes[=
最後運行結果如下:
好了Tcp粘包的問題我們解決了。下一章我們將解決Udp丟包的個人解決方案!
附上源碼:SocketProQuests.zip