Go实现简单的Socket服务端笔记(八)

本文介绍了如何在Go中实现一个简单的Socket服务端,特别关注session的Read方法,处理粘包和拆包问题。文章遵循特定的数据包协议,并提供了异常数据检测,错误时关闭连接。代码已上传至GitHub,包括`buffer.go`和`session.go`的修改。
摘要由CSDN通过智能技术生成
session中Read方法实现粘包拆包处理

定义简单协议,数据包头由4字节构成:
第1位固定为’$’
第2-3位为Body长度(uint16)
第4位固定为’#’
接收数据时若第1位和第4位不正确则认为接收到异常数据,同时关闭socket连接

本文代码查看github:
https://github.com/zboyco/go-server/tree/step-8


为了实现粘包拆包处理,我们自己实现一个buffer类来管理数据
在server目录中增加buffer.go,这里主要参考了https://studygolang.com/articles/12088

完整代码如下

buffer.go

package server

import (
	"errors"
	"io"
)

type buffer struct {
   
	reader io.Reader //
	buf    []byte    //缓存
	start  int       //有效位开始索引
	end    int       //有效位结束索引
}

func newBuffer(reader io.Reader, len int) *buffer {
   
	buf := make([]byte, len)
	return &buffer{
   reader, buf, 0, 0}
}

func (instance *buffer) len() int {
   
	return instance.end - instance.start
}

//cleanBuf 清理缓存中已提取的数据
func (instance *buffer) cleanBuf() {
   
	if instance.start == 0 {
   
		
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值