go模拟网络数据包传送代码

1.构建数据包过程

复制代码
package protocol

import (
    "bufio"
    "bytes"
    "encoding/binary"
    "fmt"
)

//构建网络中数据包格式
func Encode (message string ) []byte {
    var length = int32(len(message))
    var pkg = new(bytes.Buffer)
    err:=binary.Write(pkg,binary.LittleEndian,length)//前四个字节
    if err != nil {
        fmt.Println("build pkg is error")
        return nil
    }
    err=binary.Write(pkg,binary.LittleEndian,[]byte(message))
    if err != nil {
        return nil
    }
    return pkg.Bytes()
}
//解包过程
func Decode( reader *bufio.Reader) string {
    lengthBytes,_:= reader.Peek(4)//前4个字节数据
    lengthBuff:=bytes.NewBuffer(lengthBytes)
    var length int32
    binary.Read(lengthBuff,binary.LittleEndian,&length)

    //if int32(reader.Buffered()) < length +4 {
    //    return nil
    //}

    pack:=make([]byte, int(4+length))
    reader.Read(pack)
    return string(pack[4:])

}
复制代码

1.服务端

复制代码
package main

import (
    "bufio"
    "fmt"
    "net"
    "protocol"
)

func process(conn net.Conn){
    defer conn.Close()
    reader:=bufio.NewReader(conn)
    for {
        msg:= protocol.Decode(reader)
        fmt.Printf("%v\n",msg)
    }
}

func main(){
    listener,err:=net.Listen("tcp","127.0.0.1:8890")
    if err != nil {
        fmt.Println("start server is erros")
        return
    }
    for {
        conn,_:= listener.Accept()
        go process(conn)
    }
    defer listener.Close()
}
复制代码

2.客户端

复制代码
package main

import (
    "log"
    "net"
    "protocol"
    "time"
)

func main(){
    conn,err:=net.Dial("tcp","127.0.0.1:8890")
    if err != nil {
        log.Fatal("is error")
        return
    }
    str:="hello word你好"
    for i:=0;i<10;i++ {
        bytes:= protocol.Encode(str)
        conn.Write(bytes)
        time.Sleep(time.Second)
    }
}
复制代码

 

posted on   孤灯引路人  阅读(111)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示