php与tcp哪个快,PHP程序员如何理解TCP协议
理解成一個TCP連接就是兩根相反流動的水管,水就是其中的數(shù)據(jù),
數(shù)據(jù)是沒有邊界的,水流也沒有界限,因此你需要根據(jù)水流的大小,來截取對應(yīng)的數(shù)據(jù),解碼成你需要的數(shù)據(jù)。
比如協(xié)議規(guī)定tcp 的頭部2個字節(jié)表示長度,余下的字節(jié)表示body部分的具體內(nèi)容(具體協(xié)議可以自定義)
于是我在第一次讀取數(shù)據(jù)的時候,先讀取2個字節(jié),然后把這兩個字節(jié)轉(zhuǎn)成10進(jìn)制,就是body的長度. 然后重新生成body的數(shù)組,繼續(xù)讀:var conn net.Conn
type YourStruct struct {
Username string `json:"username"`
}
for {
b := make([]byte, 2)
_, err := io.ReadFull(conn, b)
if err != nil {
return
}
length := binary.BigEndian.Uint16(b)
body := make([]byte, length)
_, err = io.ReadFull(conn, body)
if err != nil {
return
}
// 解析結(jié)構(gòu)體
var v = new(YourStruct)
json.Unmarshal(body, v)
fmt.Println(v.Username)
}
寫數(shù)據(jù)也是一樣的道理:先計算需要寫的長度,轉(zhuǎn)換成byte數(shù)組發(fā)送,然后再發(fā)送body。var conn net.Conn
type YourStruct struct {
Username string `json:"username"`
}
for {
v := YourStruct{Username: "hahah"}
data, _ := json.Marshal(v)
header := make([]byte, 2)
binary.BigEndian.PutUint16(header, uint16(len(data)))
// 寫頭
conn.Write(header)
// 寫body
conn.Write(data)
}
tcp的邊界定義就是跟據(jù)你定的協(xié)議,組裝好數(shù)據(jù)包,發(fā)送的時候組裝包,獲取的時候拆包.
2個字節(jié)的頭,body最長應(yīng)該是65535個字節(jié),超過這個長度,header就應(yīng)該增加長度
總結(jié)
以上是生活随笔為你收集整理的php与tcp哪个快,PHP程序员如何理解TCP协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1人份汤圆用多少糯米粉?
- 下一篇: C 读写php,C语言读取文件所有内容