粘包java消息中间件_golang tcp 粘包拆包问题处理,完整demo

解决tcp粘包拆包问题,有多种处理方案,这里在数据包中添加数据包长度字段,按长度读取字节数据得到完整的数据包。定义的方法如下:

bytes-packet.go

package bpacket

import (

//"fmt"

"bytes"

"encoding/binary"

)

var (

// 完整的数据包

packet = make([]byte, 0)

// 缓存

cache = make([]byte, 0)

)

const (

// 每个数据包前4个字节保存一个整形,该整形记录数据包的字节长度

HEADER_LEN = 4

)

// 打包

func Packet(buf []byte) []byte {

return append(intToBytes(len(buf)), buf...)

}

// 解包

func Unpack(buf []byte) ([]byte) {

buf = append(cache, buf...)

length := len(buf)

messageLength := bytesToInt(buf[:HEADER_LEN])

// 当前数据包的总长度

total := HEADER_LEN + messageLength

if length < total {

cache = buf

return []byte{}

} else if (length == total) {

cache = []byte{}

return buf[HEADER_LEN:]

} else {

cache = buf[total:]

return buf[HEADER_LEN:total]

}

}

//整形转换成字节

func intToBytes(n int) []byte {

x := int32(n)

bytesBuffer := bytes.NewBuffer([]byte{})

binary.Write(bytesBuffer, binary.BigEndian, x)

return bytesBuffer.Bytes()

}

//字节转换成整形

func bytesToInt(b []byte) int {

bytesBuffer := bytes.NewBuffer(b)

var x int32

binary.Read(bytesBuffer, binary.BigEndian, &x)

return int(x)

}

Demo:

server.go

package main

import (

"fmt"

"io"

"net"

"github.com/itchin/bytes-packet"

)

func main() {

server, err := net.Listen("tcp", ":9000")

if err != nil {

panic(err)

}

defer server.Close()

for {

conn, err := server.Accept()

if err != nil {

continue

}

defer conn.Close()

go run(conn)

}

}

func run(conn net.Conn) {

// 每次读取的字节流

buf := make([]byte, 1)

for {

n, err := conn.Read(buf)

if err != nil || err == io.EOF {

conn.Close()

break

}

packet := bpacket.Unpack(buf[:n])

if len(packet) > 0 {

fmt.Println(string(packet))

}

}

}

client.go

package main

import (

"fmt"

"github.com/itchin/bytes-packet"

"net"

"time"

)

func main() {

conn, err := net.Dial("tcp", "127.0.0.1:9000")

if err != nil {

fmt.Printf("connect failed, err : %v\n", err.Error())

return

}

defer conn.Close()

msg := "hello world"

conn.Write(bpacket.Packet([]byte(msg)))

time.Sleep(time.Second / 10)

}

作者: itchin

链接: https://www.jianshu.com/p/c2cfda11f74c

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

到此这篇关于“golang tcp 粘包拆包问题处理,完整demo”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持Go语言编程网!

相关文章:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值