net包之UDPConn

处理TCP和UDP之间的主要区别是如何处理多个客户端可能同时有数据包到达,没有一个管理TCP会话的缓冲。主要需要调用的是

func ResolveUDPAddr(net, addr string) (*UDPAddr, os.Error)

func DialUDP(net string, laddr, raddr *UDPAddr) (c *UDPConn, err os.Error)

func ListenUDP(net string, laddr *UDPAddr) (c *UDPConn, err os.Error)

func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err os.Error

func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (n int, err os.Error)

UDPConn

该类型不但实现了Conn接口,还实现了PacketConn接口,这个接口的主要方法ReadFrom和WriteTo用来处理数据包的读取和写入。

type UDPConn struct {

        conn

}

客户端:

package main



import (

        "net"

        "os"

        "fmt"

)



func main() {

        if len(os.Args) != 2 {

                fmt.Fprintf(os.Stderr, "Usage: %s host:port", os.Args[0])

                os.Exit(1)

        }

        service := os.Args[1]



        udpAddr, err := net.ResolveUDPAddr("up4", service)

        checkError(err)



        conn, err := net.DialUDP("udp", nil, udpAddr)

        checkError(err)



        _, err = conn.Write([]byte("anything"))

        checkError(err)



        var buf [512]byte

        n, err := conn.Read(buf[0:])

        checkError(err)



        fmt.Println(string(buf[0:n]))



        os.Exit(0)

}



func checkError(err error) {

        if err != nil {

                fmt.Fprintf(os.Stderr, "Fatal error ", err.Error())

                os.Exit(1)

        }

}

服务端:

/* UDPDaytimeServer

 */

package main



import (

        "fmt"

        "net"

        "os"

        "time"

)



func main() {



        service := ":1200"

        udpAddr, err := net.ResolveUDPAddr("up4", service)

        checkError(err)



        conn, err := net.ListenUDP("udp", udpAddr)

        checkError(err)



        for {

                handleClient(conn)

        }

}



func handleClient(conn *net.UDPConn) {



        var buf [512]byte



        _, addr, err := conn.ReadFromUDP(buf[0:])

        if err != nil {

                return

        }



        daytime := time.Now().String()



        conn.WriteToUDP([]byte(daytime), addr)

}



func checkError(err error) {

        if err != nil {

                fmt.Fprintf(os.Stderr, "Fatal error ", err.Error())

                os.Exit(1)

        }

}

你可能感兴趣的:(UDP)