• 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)
            }
    }
    
  • 相关阅读:
    几种连接数据库的OLEDB驱动程序
    Javascript如何访问和处理系统文件
    如何自学Java 经典
    Android Studio 修改 包名
    Android Studio -导入项目 gradle处理
    Android Studio- 把项目提交到SVN中操作方法
    android studio 运行太慢了
    Java多线程 -sleep 用法详解
    Java -native 方法
    Java多线程 -yield用法
  • 原文地址:https://www.cnblogs.com/zhepama/p/3028496.html
Copyright © 2020-2023  润新知