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")
}
}
// }()
}