1. 程式人生 > 其它 >Go基礎知識-TCP/UDP

Go基礎知識-TCP/UDP


1.網路程式設計:物理層->資料鏈路層->網路層->傳輸層->應用層

2.Socket是應用層與TCP/IP協議族通訊的中間軟體抽象層

3.TCP程式設計:net包裡面,並且粘包的問題需要注意

服務端處理流程:

1.監聽埠2.接收客戶端請求建立連結3.建立goroutine處理連結

客戶端處理流程:

1.建立與服務端連線 2. 收發資料 3.關閉連線

案例:

服務端:

func main(){
//1.監聽埠:Listen
listen,err := net.Listen("tcp","127.0.0.1:4567")
if err != nil{
fmt.Println("listen error:",err)
return
}
defer listen.Close()
fmt.Println("listen success")

//接收客戶端請求建立連線 Accept
for{
//建立連線
conn,err := listen.Accept()
if err != nil{
fmt.Println("Accept error:",err)
continue
}
fmt.Println("收到客戶端連線進來=",conn.RemoteAddr().String())
//接收資料
go func(_conn net.Conn) {
defer _conn.Close()
for{
reader := bufio.NewReader(_conn)
var buf [128]byte
n,err := reader.Read(buf[:])
if err != nil{
fmt.Println("read err:",err)
break
}
data := string(buf[:n])
fmt.Println("receive data=",data)
//給客戶端發一條
_conn.Write([]byte("已經收到這條訊息"))
}
}(conn)

}
}
//使用tcp工具傳送
//結果如下:

listen success
收到客戶端連線進來= 127.0.0.1:55559
receive data= 你哈啊
read err: read tcp 127.0.0.1:4567->127.0.0.1:55559: wsarecv: An existing connection was forcibly closed by the remote host.

客戶端:

func main(){
//1.建立與服務端連線 2. 收發資料 3.關閉連線
_conn,err := net.Dial("tcp","127.0.0.1:4567")
if err != nil{
fmt.Println("conn to server error:",err)
return
}
defer _conn.Close()
//2. 收發資料 Accept
for i:=0;i<10;i++{
//傳送資料
_,err = _conn.Write([]byte("你好server"))
if err != nil{
fmt.Println("send msg err=",err)
return
}
//接收服務端資料
var buf [128]byte
n,err := _conn.Read(buf[:])
if err != nil{
fmt.Println("read server content error",err)
return
}
fmt.Println("server msg=",string(buf[:n]))
}

}

4.UDP程式設計:換個函式