九. 網路程式設計 , 直接上**
9.1 tcp協議
9.1.1. 基本使用
// server端**package main
import (
"bufio""
fmt""io
""net"
)func main()
fmt.println(
"tcp服務已經啟動")
for go process1(conn) //啟動乙個goroutine處理連線
}}//簡單使用
func process1(conn net.conn)
recvstr :=string(buf[:n])
fmt.println(
"收到客戶端發來的資料:
", recvstr)
conn.write(byte(
"伺服器說:
" + recvstr)) //傳送資料
}}
// client端**package main
import (
"bufio""
fmt"
"net""
os""strings")
func main()
//簡單使用
func demo1()
defer conn.close() //關閉連線
inputreader :=bufio.newreader(os.stdin)
for _, err = conn.write(byte(inputinfo)) //傳送資料
if err !=nil
buf := [512]byte{}
n, err := conn.read(buf[:]) //接受資料
if err !=nil
fmt.println(
"接收伺服器資料:
", string(buf[:n]))
}}
9.1.2. 粘包問題
// server端**package main
import (
"bufio""
fmt""io
""net"
)func main()
fmt.println(
"tcp服務已經啟動")
for go process2(conn) //啟動乙個goroutine處理連線
}}//粘包
func process2(conn net.conn)
if err !=nil
recvstr :=string(buf[:n])
fmt.println(
"收到client發來的資料:
", recvstr)
//收到client發來的資料: 完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了
//收到client發來的資料: 完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了完蛋了,粘包了
}}
// client端**package main
import (
"bufio""
fmt"
"net""
os""strings")
func main()
//粘包產生的原因:
// 1.由nagle演算法造成的傳送端的粘包:nagle演算法是一種改善網路傳輸效率的演算法。簡單來說就是當我們提交一段資料給tcp傳送時,tcp並不立刻傳送此段資料,而是等待一小段時間看看在等待期間是否還有要傳送的資料,若有則會一次把這兩段資料傳送出去。
// 2.接收端接收不及時造成的接收端粘包:tcp會把接收到的資料存在自己的緩衝區中,然後通知應用層取資料。當應用層由於某些原因不能及時的把tcp的資料取出來,就會造成tcp緩衝區中存放了幾段資料。
func demo2()
defer conn.close() //關閉連線
msg :=`完蛋了,粘包了`
for i := 0; i < 20; i++
}
9.1.3. 解決粘包問題: 封包
// 封包解包**package proto
import (
"bufio""
bytes""
encoding/binary")
//encode 將訊息編碼
func encode(message string) (byte, error)
//寫入訊息實體
err =binary.write(pkg, binary.littleendian, byte(message))
if err !=nil
return
pkg.bytes(), nil
}//decode 解碼訊息
func decode(reader *bufio.reader) (string, error)
//buffered返回緩衝中現有的可讀取的位元組數。
if int32(reader.buffered()) < length+4
//讀取真正的訊息資料
pack := make(byte, int(4+length))
_, err =reader.read(pack)
if err !=nil
return string(pack[4:]), nil
}
// sever端**"tcp服務已經啟動")
for go process3(conn) //啟動乙個goroutine處理連線
}}//解決粘包
func process3(conn net.conn)
if err !=nil
fmt.println(
"收到client發來的資料:
", msg)
}}
// client端**func main() //處理粘包
// server端**//handler函式
// client端**go語言學習筆記 9 函式
格式 func函式名 引數列表 返回值列表 引數列表 引數列 式類似變數宣告,但不需要var關鍵字 age int,name string i1,i2 int 返回值列表 1 基本格式同引數列表 2 返回值可以沒有變數名 3 當只有乙個返回值,且返回值變數未命名時,或沒有返回值時,括號可省略 多返回...
學習筆記9
函式 函式以def開頭,後面接函式名和括號,然後接冒號 函式的最後接return結束函式,並返回乙個值,可以沒有,就相當於返回none 函式呼叫時直接用函式名加括號 括號內為需要傳入的引數。傳入函式的引數是實參 在函式內使用的大多都為形參 形參只能在函式內使用,函式結束後就自動釋放記憶體了。函式中的...
學習筆記9
今天來進行系統的學習一下css 層疊樣式表 首先說一下層疊次序,四個優先權 1.瀏覽器預設設定 2.外部樣式表 3內部樣式表 位於 內部樣式表 內聯樣式 this is a paragraph 多重樣式 例 h1居中對齊 h1 h1 css的使用 背景 background color backgr...