• 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)
            }
    }
    
  • 相关阅读:
    Java项目中加载properties文件的方式
    第十一篇 JVM之运行时数据区<7>: 本地方法栈
    第十七篇 JVM之运行时数据区<13>: 字符串常量池
    第十四篇 JVM之运行时数据区<10>: 对象分配过程
    基于zxing工具生成二维码
    第十八篇 JVM之运行时数据区<14>: 方法区的垃圾收集
    第十六篇 JVM之运行时数据区<12>: 方法区
    第十二篇 JVM之运行时数据区<8>: Java堆
    圣诞
    LeetCode 748 最短补全词
  • 原文地址:https://www.cnblogs.com/zhepama/p/3028496.html
Copyright © 2020-2023  润新知