go-server
项目地址:https://github.com/zboyco/go-server
go-server 是我在学习golang的过程中,从最简单的socket一步一步改造形成的。
目前功能如下:
- 普通的tcp功能(废话)
- 使用标准库
bufio.Scanner
实现拆包,可以直接使用bufio.Scanner
内置的拆包协议,当然也可以自定义拆包协议 - 提供普通
OnMessage
和命令路由两种使用模式 - 提供单个
Action
添加路由方法,同时也采用实现ActionModule
接口的方式批量添加路由 - 过滤器支持自定义,只需实现
ReceiveFilter
接口 - 支持设置会话超时时间,超时的会话会自动关闭
- 提供会话查找方法,可以根据ID或自定义属性查找会话
- 支持tls
- …
问题如下:
- 目前只支持tcp4协议
- …原谅我不会写文档 (╥╯^╰╥)
- 有什么问题大家随便留言
- …
使用方法
安装
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