go | 写一个c/s 服务器 采用utf-8编码 | 抓包简单分析

原来 go 实现 c/s是这么方便的啊

server.go

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

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))
        }

}

抓包分析

tcpdump -vvv -n -i any -s0 port 8080 -w test.pcap

分析这个包

分析这个高也是可是很好的学习网络结构的

你会发现 linux cooked capture 这就是链路层

ip 协议就是网络层 20B 主要就是src 和 dst ip

这层协议就是找ip

接着是udp 传输数据。

udp 协议头8B

当两端确定好了(也就是找到src 和 dst)

就可以开始传输数据,这就是面向服务了,直接通过端口面向服务

这里有一个知识点,5分唯一性? 就是 src + src:port + 协议 + dst + dst:port

然后又可以扯远 timeout 、端口复用

相关推荐
茶杯梦轩7 小时前
从零起步学习RabbitMQ || 第二章:RabbitMQ 深入理解概念 Producer、Consumer、Exchange、Queue 与企业实战案例
服务器·后端·消息队列
RuoZoe2 天前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
YuMiao2 天前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
Sinclair5 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
祈安_5 天前
C语言内存函数
c语言·后端
Rockbean6 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
茶杯梦轩6 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试
花酒锄作田7 天前
Gin 框架中的规范响应格式设计与实现
golang·gin
海天鹰7 天前
【免费】PHP主机=域名+解析+主机
服务器
norlan_jame7 天前
C-PHY与D-PHY差异
c语言·开发语言