server.go
package main
import (
"bufio"
"bytes"
"fmt"
"golang.org/x/text/encoding/unicode"
"golang.org/x/text/transform"
"io"
"net"
"os"
"strings"
"time"
)
func main() {
addr, err := net.ResolveUDPAddr("udp", ":8080")
if err != nil {
panic(err)
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
panic(err)
}
defer conn.Close()
buf := make([]byte, 1024)
utf8Decoder := unicode.UTF8.NewDecoder()
for {
n, addr, err := conn.ReadFromUDP(buf)
if err != nil {
fmt.Println("read error: ", err)
continue
}
decodedReader := transform.NewReader(bufio.NewReader(bytes.NewReader(buf[:n])), utf8Decoder)
decodedBytes, _ := io.ReadAll(decodedReader)
fmt.Printf("Received from [%s] and the message is\n%s\n", addr, string(decodedBytes))
reader := bufio.NewReader(os.Stdin)
fmt.Println("Enter message: ")
response, _ := reader.ReadString('\n')
response = time.Now().Format(time.RFC3339) + " " + response
utf8Encoder := unicode.UTF8.NewEncoder()
// 使用 UTF-8 编码器编码要发送的数据
encodedReader := transform.NewReader(strings.NewReader(response), utf8Encoder)
encodedBytes, _ := io.ReadAll(encodedReader)
conn.WriteToUDP(encodedBytes, addr)
}
}
client.go
package main
import (
"bufio"
"bytes"
"fmt"
"golang.org/x/text/encoding/unicode"
"golang.org/x/text/transform"
"io"
"net"
"os"
"strings"
"time"
)
func main() {
addr, err := net.ResolveUDPAddr("udp", "localhost:8080")
if err != nil {
panic(err)
}
conn, err := net.DialUDP("udp", nil, addr)
if err != nil {
panic(err)
}
defer conn.Close()
reader := bufio.NewReader(os.Stdin)
buf := make([]byte, 1024)
for {
fmt.Println("Enter message: ")
message, _ := reader.ReadString('\n')
message = time.Now().Format(time.RFC3339) + " " + message
utf8Encoder := unicode.UTF8.NewEncoder()
encodedReader := transform.NewReader(strings.NewReader(message), utf8Encoder)
encodedBytes, _ := io.ReadAll(encodedReader)
conn.Write(encodedBytes)
n, _, err := conn.ReadFromUDP(buf)
if err != nil {
fmt.Println("read err: ", err)
continue
}
utf8Encoder_ := unicode.UTF8.NewDecoder()
decodedReader := transform.NewReader(bufio.NewReader(bytes.NewReader(buf[:n])), utf8Encoder_)
decodedBytes, _ := io.ReadAll(decodedReader)
fmt.Printf("Received from [%s] and the message is\n%s\n", addr, string(decodedBytes))
}
}
抓包分析
分析这个包
这里有一个知识点,5分唯一性? 就是 src + src:port + 协议 + dst + dst:port
然后又可以扯远 timeout 、端口复用