go-server 一个在学习中形成的socket服务

go-server

项目地址:https://github.com/zboyco/go-server

go-server 是我在学习golang的过程中,从最简单的socket一步一步改造形成的。

目前功能如下:

  1. 普通的tcp功能(废话)
  2. 使用标准库bufio.Scanner实现拆包,可以直接使用bufio.Scanner内置的拆包协议,当然也可以自定义拆包协议
  3. 提供普通OnMessage和命令路由两种使用模式
  4. 提供单个Action添加路由方法,同时也采用实现ActionModule接口的方式批量添加路由
  5. 过滤器支持自定义,只需实现ReceiveFilter接口
  6. 支持设置会话超时时间,超时的会话会自动关闭
  7. 提供会话查找方法,可以根据ID或自定义属性查找会话
  8. 支持tls

问题如下:

  1. 目前只支持tcp4协议
  2. …原谅我不会写文档 (╥╯^╰╥)
  3. 有什么问题大家随便留言

使用方法

安装

go get github.com/zboyco/go-server

简单使用

默认使用换行符\n拆分数据包

// main
func main() {
   
	// 新建服务
	mainServer := goserver.New("", 9043)
	// 注册OnMessage事件
	mainServer.SetOnMessage(onMessage)
	// 开启服务
	mainServer.Start()
}

// 接收数据方法
func onMessage(client *goserver.AppSession, token []byte) {
   
	// 将bytes转为字符串
	result := string(token)
	// 输出结果
	log.Println("接收到客户[", client.ID, "]数据:", result)
	// 发送给客户端
	client.Send([]byte("Got!"))
}

使用tls

使用NewWithTLS方法新建一个tls服务

	crt, err := tls.LoadX509KeyPair("server.crt", "server.key")
	if err != nil {
   
		log.Fatalln(err.Error())
	}
	// 新建服务
	mainServer := goserver.NewWithTLS("", 9043, &tls.Config{
   
		Certificates: []tls.Certificate{
   crt},
	})

自定义拆包协议

go-server 采用标准库bufio.Scanner实现数据拆包,默认使用ScanLines实现换行符拆包,支持自定义拆包规则,可以根据自己的需求制定,只需要自定义一个bufio.SplitFunc方法即可。
假设我们采用 head+body的方式定义package,并指定第1个字节是'$',第4个字节是'#',第2、3位两个字节使用int16存储body长度,例子如下:

func main() {
   
	// 新建服务
	mainServer := goserver.New("", 9043)
	// 根据协议定义拆包规则
	mainServer.SetSplitFunc(func(data []byte, atEOF bool) (int, []byte, error) {
   
		if atEOF {
   
			return 0, nil, errors.New("EOF")
		}
		if data[0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值