GO學習筆記 9

2022-07-25 23:21:14 字數 3953 閱讀 1374

九. 網路程式設計 , 直接上**

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...