1. 程式人生 > >[golang]實現UDP協議下的C/S模型

[golang]實現UDP協議下的C/S模型

上個帖子總結了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 } } }

有任何問題都可以在下面給我留言哦