專案中用的就是demo中的部分**,連線上後,就是接收報文,處理報文,報文格式具體要和傳送端協商,我這裡的報文格式是這樣的。
一組報文格式如下:
1.乙個float,表示這組報文的總位元組數下面是解析一組報文的核心**:2.乙個float,表示變數名的總位元組數
3.多個char,每乙個變數名
4.乙個float,表示資料的總位元組數
5.多個double,每乙個變數對應的數值
//對data清零
recvdata = new byte[1024];
//獲取收到的資料的長度
recvlen = clientsocket.receive(recvdata);
totallength = bitconverter.toint32(recvdata, index);//報文的總長
index += 4;
variablecount = bitconverter.toint32(recvdata, index);//變數名總位元組數
index += 4;
string c = encoding.ascii.getstring(recvdata, index, variablecount);//變數名
string arr = c.split('#');//變數名
index += variablecount;
this.inputntnormal = bitconverter.toint32(recvdata, index);
index += 4;
double a = bitconverter.todouble(recvdata, index);//每個變數名對應的double值
index += 8;
後來接收並儲存完資料後,顯示發現,由於網路不穩定,不一定會一次就正好發一組報文,有可能網路好,一次發了多個報文,有可能不好,發好幾次才發完一組報文,所以還要把接收的資料處理一下,這裡邏輯有點繞,多虧我同事的鼎力相助,不然沒寫過的我估計要想好久。
接收報文,獲取該組報文的總長度,跟接收到的長度進行比較,接收了多組報文,先擷取第一組報文,處理完後,再判斷第二組報文是否接收完全,完全則處理,不完全則保留下來,再次迴圈接收下一次資料,把下次接收的資料追加到保留的資料後面,重新組成乙個完整的報文。當時我模擬一次收到兩個半報文處理,但是始終跳不出思維怪圈,找不到規律 ,不知道怎麼用迴圈,最後還是同事幫助下,用乙個while迴圈,裡面乙個if,if條件不滿足就跳出while迴圈,while迴圈的條件是剩餘的資料長度大於報文的長度,就是後面有乙個完整的報文。跳出while迴圈則證明剩餘的已經不是乙個完整的報文了,需要在此接收資料,並且追加資料。
IP報文格式和例項分析
上面是ip的報文格式,接下來我們先說明各個欄位的意義。然後,用etheral軟體轉包分析ip的報文格式。1.版本 ip報文中,版本佔了4位,用來表示該協議採用的是那乙個版本的ip,相同版本的ip才能進行通訊。一般此處的值為4,表示ipv4。2.頭長度 該字段用四位表示,表示整個ip包頭的長度,其中數...
使用形式語言定義通訊報文格式
本文由 lonelyrains 在通訊過程中,有幾種常用的通訊報文定義格式。有if else直接層層遞進融合 的方式,有自然語言描述的方式定義一條條規則,但是很少發現有用形式語言定義的。其實,形式語言定義的報文,由於是規範,可以比較方便地讓計算機識別,從而自動轉換成 它和直接if else定義報文相...
HTTP請求報文格式 GET和POST
最近在做安卓客戶端上傳外掛程式功能,供後台呼叫。其中涉及到了拼接http請求報文,所以就對報文內容研究了一下,現在做個總結,備忘。自己使用fiddler抓取報文如下 post請求報文 此處省略二進位制等資料 7e21361611db0 包含4部分。1.第一行 請求行,說明請求型別和協議版本。http...