type UDPAddr struct {
IP IP
Port int
}
func ResolveUDPAddr(net, addr string) (*UDPAddr, error)
在呼叫函數 ResolveUDPAddr() 時,引數 net 是網路協定名,可以是“udp”、“udp4”或“udp6”。引數 addr 是 IP 地址或域名,如果是 IPv6 地址則必須使用“[]”括起來。另外,埠號以“:”的形式跟隨在 IP 地址或域名的後面,埠是可選的。
func (a *UDPAddr) Network() string
func (a *UDPAddr) String() string
type UDPConn struct {
//空結構
}
func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err error)
func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error)
func ListenUDP(net sting, laddr *UDPAddr) (*UDPConn, error)
在呼叫函數 ListenUDP() 時,引數 net 是網路協定名,可以是“udp”、“udp4”或“udp6”。引數 laddr 是伺服器本地地址,可以是任意活動的主機地址,或者是內部測試地址“127.0.0.1”。該函數呼叫成功,返回一個 UDPConn 物件;呼叫失敗,返回一個錯誤型別。//UDP Server 端設計 package main import( "fmt" "net" "os" ) func main() { service := ":5001" udpAddr, err := net.ResolveUDPAddr("udp", service) checkError(err) conn, err := net.ListenUDP("udp", udpAddr) checkError(err) for { handleClient(conn) } } func handleClient(conn *net.UDPConn) { var buf [512]byte n, addr, err := conn.ReadFromUDP(buf[0:]) if err != nil { return } fmt.Println("Receive from client", addr.String(), string(buf[0:n])) conn.WriteToUDP([]byte("Welcome Client!"), addr) } func checkError(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) } }
func DialUDP(net string, laddr, raddr *UDPAddr)(*UDPConn, error)
在呼叫函數 DialUDP() 時,引數 net 是網路協定名,可以是“udp”、“udp4”或“udp6”。引數 laddr 是本地主機地址,可以設為 nil。引數 raddr 是對方主機地址,必須指定不能省略。函數呼叫成功後,返回 UDPConn 物件;呼叫失敗,返回一個錯誤型別。func (c *UDPConn) Close() error
該方法呼叫成功後,關閉 UDPConn 連線;呼叫失敗,返回一個錯誤型別。// UDP Client端設計 package main import( "fmt" "net" "os" ) func main() { if len(os.Args) != 2 { fmt.Fprintf(os.Stderr, "Usage: %s host:port", os.Args[0]) } service := os.Args[1] udpAddr, err := net.ResolveUDPAddr("udp", service) checkError(err) conn, err := net.DialUDP("udp", nil, udpAddr) checkError(err) _, err = conn.Write([]byte("Hello server!")) checkError(err) var buf [512]byte n, addr, err := conn.ReadFromUDP(buf[0:]) checkError(err) fmt.Println("Reply form server", addr.String(), string(buf[0:n])) conn.Close() os.Exit(0) } func checkError(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) } }編譯並執行伺服器端和用戶端,測試過程如下:
啟動伺服器:go run .main.go
客戶機連線:go run .client.go 127.0.0.1:5001
伺服器響應:Receive from client 127.0.0.1:53825 Hello server!
客戶機接收:Reply form server 127.0.0.1:5001 Welcome Client!