【go-tcpcat】Go TCP服务器框架 支持Hook、功能码函数

Github仓库: https://github.com/xuehu96/go-tcpcat (欢迎★Star)
国内仓库: https://gitee.com/xuehu96/go-tcpcat

TCP常应用于物联网数据服务器、游戏服务器等,且通常都是私有格式协议;
go-tcpcat只需很少的代码就可以实现TCP透传、消息处理功能;
消息处理支持Go语言Hook将私有协议的解析程序注入框架、Lua脚本处理、PythonGRPC调用处理、HTTP回调处理、Redis缓存数据等。

安装:

go get -u github.com/xuehu96/go-tcpcat

1.狗子函数(Hooks)

狗子函数就是回调函数,指定事件发生后,框架会回调提前注入的处理函数,
默认的处理函数是通过日志打印,设置狗子函数后,会覆盖默认的处理函数

程序设置了以下狗子函数:

Hook调用时机用途示例
OnListenListen成功后回调程序启动 New资源
OnAccept新客户端连接调用判断客户端来源,限制客户端数量
OnReadData接收到客户端数据调用判断数据格式,去头尾等
OnFnCode从数据中解析出功能码功能码和自定义功能处理函数
OnSendData向客户端发送数据后调用判断是否发送成功,重发或通知调用方
OnClose客户端主动或被断开后调用断开后通知或标记客户端离线
OnStopListen关闭后调用清理资源

狗子使用方法:

var fnc1 server.OnXXXXXX = func(param) ret{ 
	// TODO
}
var fnc2 server.OnYYYYYY = func(param) ret{
	// TODO
}
         ...

hooks := server.Hook{
	OnXXXXXX: fnc,
	OnYYYYYY: fnc,
	...
}
s := server.New(
    server.WithHook(hooks),
	...
)

2.功能码和自定义功能处理函数

私有协议中区分数据包处理方式的一般叫功能码,类似于HTTP的路由

功能码解析函数OnFnCode(从data中解析出功能码)

var fnc server.OnFnCode = func(buf []byte) string {
	s := string(buf)
	if strings.Contains(s, "ping") {
		return "A"
	}
	if s[0] == 'B' {
		return "B"
	}
	return ""
}

hooks := server.Hook{
	OnFnCode: fnc,
}

处理对应功能码的函数(类似于路由)

s.AddFn("A", func(c *server.Client, code string, buf []byte, len int) {
	// TODO
})
s.AddFn("B", func(c *server.Client, code string, buf []byte, len int) {
    // TODO
})

3. Ping-Pong TCP服务器example

客户端连接后 向服务器发送数据,服务器按以下格式处理

  • “ping” 回复 “pong”
  • “time” 回复当前服务器时间
  • “exit” 服务器主动断开
  • 客户端发送其他格式 不回复
package main

import (
	"context"
	"github.com/xuehu96/go-tcpcat/pkg/logger"
	"github.com/xuehu96/go-tcpcat/server"
	"log"
	"net"
	"os"
	"os/signal"
	"strings"
	"syscall"
	"time"
)


func main() {
	// 创建TCPListener
	ln, err := net.Listen("tcp", ":9677")
	if err != nil {
		log.Fatalln(err.Error())
		return
	}

	// 自定义如何从数据包中获取获取功能码
	var fnc server.OnFnCode = func(buf []byte) string {
		s := string(buf)
		if strings.Contains(s, "ping") {
			return "p"
		}
		if strings.Contains(s, "time") {
			return "t"
		}
		if strings.Contains(s, "exit") {
			return "x"
		}
		return ""
	}

	hooks := server.Hook{
		OnFnCode: fnc,
	}
	// 创建TCP服务实例
	s := server.New(
		server.WithHook(hooks),
		server.WithListener(ln),
		server.WithLogger(logger.DebugLogger()),
	)

	// 添加功能码对应的处理函数 类似于HTTP的路由
	s.AddFn("p", func(c *server.Client, code string, data []byte) {
		c.ReplyData([]byte("pong"))
	})
	s.AddFn("t", func(c *server.Client, code string, data []byte) {
		currentTime := time.Now()
		c.ReplyData([]byte(currentTime.Format("2006-01-02 15:04:05.000000000")))
	})
	s.AddFn("x", func(c *server.Client, code string, data []byte) {
		c.Close()
	})

	// Ctrl-C 结束
	go func() {
		signalCh := make(chan os.Signal, 1)
		signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
		<-signalCh
		s.Stop(context.Background())
	}()

	// TCP服务器开始干活
	s.Serve()
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
apache-atlas-2.1.0-hive-hook.tar.gz是Apache Atlas项目中的一个软件包。Apache Atlas是一个开源的数据治理和元数据框架,用于收集、集成、索引和搜索数据资产。它提供了一个统一的视图来管理企业中的所有数据资产,包括表、列、模式、实体和关系等。而apache-atlas-2.1.0-hive-hook.tar.gz是Atlas项目为了与Hive集成而提供的一个插件。 Hive是一个构建在Hadoop之上的数据仓库基础设施工具,用于处理大规模的结构化数据。它提供了类似于SQL的查询和分析功能,可以将数据批量导入、导出和查询。通过与Apache Atlas的集成,可以实现对Hive中数据资产的元数据管理和治理。 在实际的应用中,apache-atlas-2.1.0-hive-hook.tar.gz可以被部署到Hive的服务器上,并与Hive的插件机制进行集成。通过配置Hive的元数据存储URL、用户名和密等信息,Atlas可以自动从Hive中提取元数据,并将其索引到Atlas的元数据仓库中。这样,用户可以在Atlas的界面中浏览和搜索Hive中的表、列和关系,并进行数据资产的管理和治理。 此外,apache-atlas-2.1.0-hive-hook.tar.gz还提供了一些其他功能,如基于分类标签的权限控制、数据血缘追踪、数据脱敏等。通过这些功能,用户可以更好地理解和管理Hive中的数据资产,提高数据治理的效率和质量。 总之,apache-atlas-2.1.0-hive-hook.tar.gz是Apache Atlas项目中用于与Hive集成的插件,通过它可以实现对Hive中数据资产的元数据管理和数据治理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值