[golang]實現UDP協議下的C/S模型
阿新 • • 發佈:2018-11-17
上個帖子總結了TCP協議下簡單的的C/S模型,現在來看一下UDP協議下的C/S模型,TCP和UDP的異同點下圖清晰可見。
因此TCP和UDP各有優缺點,選擇什麼協議進行開發得根據實際情況分析。
值得一提的是,UDP的客戶端實現和TCP的客戶端實現可以說是一模一樣的,具體可進入我的上一個帖子參考: [golang]實現Tcp協議之簡單C/S模型
但是UDP伺服器和TCP略有不同!
由於UDP是“無連線”的,所以,伺服器端不需要額外建立監聽套接字,只需要指定好IP和port,然後監聽該地址,等待客戶端與之建立連線,即可通訊,且UDP伺服器不需要併發,也可以說本身就支援併發。
進入程式碼前,我們先看一下UDP伺服器實現所需四個關鍵函式
1)建立監聽地址:
func ResolveUDPAddr(network, address string) (*UDPAddr, error)
2)建立使用者通訊的socket:
func ListenUDP(network string, laddr *UDPAddr) (*UDPConn, error)
3)接收udp資料:
func (c *UDPConn) ReadFromUDP(b []byte) (int, *UDPAddr, error)
4)寫出資料到udp:
func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error)
下面讓我們帶著這四個函式一起走進具體程式碼
package main
import (
"net"
"fmt"
"strings"
)
func main() {
//建立監聽的地址,並且指定udp協議,返回一個UDP地址和一個錯誤資訊
//我們使用127.0.0.1:6000是本機的回送地址作為師範,可以觀察效果
addr,err:=net.ResolveUDPAddr("udp","127.0.0.1:6666")
//接收一下錯誤資訊
if err!=nil {
fmt.Println("resolveudpaddr err", err)
return
}
//建立使用者通訊的socket,需要用到上面監聽函式的返回值,作為此函式的引數
conn,err:=net.ListenUDP("udp",addr)
if err!=nil {
fmt.Println("listen err",err)
return
}
//延時呼叫關閉
defer conn.Close()
buf:=make([]byte,1024)
for {
//接收udp資料,這裡還是會返回一個udp地址,處理資料後傳送給這個地址
n,udpaddr,err:=conn.ReadFromUDP(buf)
if n==0 {
fmt.Printf("使用者%s退出\n",conn.RemoteAddr().String())
break
}
if err!=nil {
fmt.Println("read err",err)
return
}
/*寫資料到udp地址,這裡只是一個事例,大家可以做不同
的資料處理後再發送,但注意只能接受字元切片型別作為函式引數*/
_,err=conn.WriteToUDP((buf[:n]),udpaddr)
if err!=nil{
fmt.Println("writeudp err:",err)
return
}
}
}
有任何問題都可以在下面給我留言哦