UDP简单的示例


package main

import (
    "context"
    "encoding/hex"
    "fmt"
    "log"
    "net"
    "time"
)

func main() {
    // 本质上udp不存在传统意义上的服务端和客户端, 他其实是无连接的。
    // 但是实际使用中, 总要有一方去监听数据, 另一方去连接所以才有了 一个服务 一个客户

    // 创建一个监听服务
    // conn, err := net.Dial("udp", ":30000")
    // conn, err := net.DialUDP("udp", &net.UDPAddr{
    //     IP:   net.ParseIP("0.0.0.0"),
    //     Port: 45103,
    // }, &net.UDPAddr{
    //     IP:   net.ParseIP("127.0.0.1"),
    //     Port: 30000,
    // })

    // 连接已经创建的服务
    conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
        IP:   net.ParseIP("127.0.0.1"),
        Port: 30000,
    })

    if err != nil {
        log.Fatalf("连接建立错误: %s", err.Error())
        return
    }
    defer conn.Close()

    //7F06FE01993FFF3C16
    //7F32F601143801001F0250000100000000000000000000000000000000323030B7C2D8BB353030FABBF7D63130381411111501893E
    //7F32F60115384000200250000100000000000000000000000000000000323030B7C2D8BB353030FABBF7D631303814111115012F09

    // go func() {
    // 创建一个计时器
    timeTickerChan := time.Tick(time.Second * 2)
    ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Millisecond*800))
    defer cancel()
    for {
        select {
        case <-timeTickerChan:
            input, err := hex.DecodeString("7F06FE01993FFF3C16")
            if err != nil {
                fmt.Printf("输入值解码错误:%s\n", err.Error())
                continue
            }

            //客户端请求数据写入 conn,并传输
            conn.WriteToUDP([]byte(input), &net.UDPAddr{
                IP:   net.ParseIP("10.10.10.4"),
                Port: 8887,
            })
            writeCount, err := conn.Write([]byte(input))
            if err != nil {
                log.Printf("数据发送错误:%s\n", err.Error())
                continue
            }
            log.Printf("输入值:%s; 发送量: %d\n", string(input), writeCount)

            go func(ctx context.Context) {
                //服务器端返回的数据写入空buf
                buf := make([]byte, 1024)
                // conn.ReadFrom()
                // conn.ReadFromUDP()
                cnt, serverAddr, err := conn.ReadFrom(buf)
                if err != nil {
                    log.Printf("客户端读取数据失败 %s\n", err)
                    return
                }
                //回显服务器端回传的信息
                log.Printf("服务器端回复: %s; 服务端信息:%s", hex.EncodeToString(buf[0:cnt]), serverAddr.String())
            }(ctx)

            select {
            case <-ctx.Done():
                fmt.Println("call successfully!!!")
                continue
            case <-time.After(time.Duration(time.Millisecond * 900)):
                fmt.Println("timeout!!!")
                continue
            }

            // input, _ = hex.DecodeString("7F32F601143801001F0250000100000000000000000000000000000000323030B7C2D8BB353030FABBF7D63130381411111501893E")
            // log.Printf("输入值:%v\n", input)
            // //客户端请求数据写入 conn,并传输
            // conn.Write([]byte(input))
            // //服务器端返回的数据写入空buf
            // cnt, err = conn.Read(buf)
            // if err != nil {
            //     log.Printf("客户端读取数据失败 %s\n", err)
            //     continue
            // }
            // //回显服务器端回传的信息
            // log.Printf("服务器端回复" + hex.EncodeToString(buf[0:cnt]) + "\n")

            // input, _ = hex.DecodeString("7F32F60115384000200250000100000000000000000000000000000000323030B7C2D8BB353030FABBF7D631303814111115012F09")
            // log.Printf("输入值:%v\n", input)
            // //客户端请求数据写入 conn,并传输
            // conn.Write([]byte(input))
            // //服务器端返回的数据写入空buf
            // cnt, err = conn.Read(buf)
            // if err != nil {
            //     log.Printf("客户端读取数据失败 %s\n", err)
            //     continue
            // }
            // //回显服务器端回传的信息
            // log.Printf("服务器端回复" + hex.EncodeToString(buf[0:cnt]) + "\n")
        }
    }

    // }()

}