使用go語言為伺服器,qt作為客戶端,利用tcp進行資料傳輸,當兩次傳送間隔過近會產生粘包現象,此時就需要乙個特定的資料格式用來區分兩個資料的邊界,我使用 特徵碼(int型別用來區分是否惡意)資料報大小(int)壓縮標誌(bool)資料(byte),但當互動時發生問題,比如qt的自定義資料格式qbytearry會在最前面加個字段用來表示自身整體大小。下面直接列出**:
go:
msglenbuf := tobytes(msglen, msg.littleendian)
msglenbuf := make(byte, unsafe.sizeof(int32(0)))
var msglen int32
//讀取len
if _, err := io.readfull(conn.conn, msglenbuf); err != nil
meslen1, err := frombyte(msglenbuf, int32(0), msg.littleendian)
if err != nil
msglen = meslen1.(int32)
func tobytes(n inte***ce{}, islittleendian bool) byte )
if !islittleendian else
return bytesbuffer.bytes()
}func frombyte(bytedara byte, item inte***ce{}, islittleendian bool) (inte***ce{}, error) else
return g, err
case uint64:
g := uint64(0)
if !islittleendian else
return g, err
case int:
g := int(0)
if !islittleendian else
return g, err
case int32:
g := int32(0)
if !islittleendian else
return g, err
case bool:
g := bool(false)
if !islittleendian else
return g, err
} return nil, fmt.errorf("unknow type %v", reflect.typeof(item))
}
上面兩個函式用於轉換,將int bool 轉成byte陣列
其實自己寫位運算也可以實現
var buffer bytes.buffer
size := inttobytes(int(9) + len(k))
feature := inttobytes(int(15))
iscompress := booltobyte(false)
data := byte(k)
buffer.write(size)
buffer.write(feature)
buffer.write(iscompress)
buffer.write(data)
conn.write(buffer.bytes())
先獲取總體大小int 為4位元組 bool為1位元組因此首先就是4*2+1=9個位元組,然後再加上資料大小最後就變為9+len(k)
再將size feature iscompress data 傳送出去即可
qt c++:
int bytetoint(qbytearray data)
bool bytetobool(qbytearray data)
qbytearray booltobyte(bool i)else
return byte;
}qbytearray inttobyte(int i)
if(receive_data.size()>(sizeof(int)+sizeof(int)))
{bool iscompress;
int data_size;
int feature;
qbytearray data;
std::string k= receive_data.tostdstring();
qdebug()《接收資料後先看看夠不夠前面兩個資料,讀取特徵值與總資料報大小,看看資料報總體大小夠不夠,然後對其進行解析。
網路遊戲資料傳輸 粘包的處理
網路傳輸大體上包含這四個協議type area command message,這四層協議是依次向下傳遞的。所謂協議,說簡單點就是伺服器端和客戶端的乙個約定,比如,向伺服器傳送 1,0,1,賬號 密碼 約定type中1代表登入模組,因為登陸不需要經過area協議,所以跳過area協議,直接到comm...
C SFTP資料傳輸
我們有些客戶公司的資料比較重要,為了安全集團公司內部都使用的是區域網,但是有時候又不得不予外界網際網路做資料互動,所以有些不重要的系統是放在外界網際網路的,這樣以來內部系統和外部系統的資料互動就成為了問題,這樣以來就使用到了sftp伺服器來作為資料傳輸的中介。下面不說了,直接上c 此處使用了第三方動...
資料傳輸方式
資料傳輸方式 1 並行傳輸與序列傳輸 並行傳輸指的是資料以成組的方式,在多條並行通道上同時進行傳輸。常用的就是將構成一 個字元 的幾位二進位製碼,分別在幾個並行通道上進行傳輸。例如,採用8單位 的字 符 可以用8個通道並行傳輸。一次傳送乙個字元,因此收 發雙方不存在字元的同步問題,不需要另加 起 止...