Signal信令传输
特性
- 支持websocket webtransport
- 类似socket.io结构
使用
go get gitee.com/DreamPublic/signal
type Signal interface {
// OnConnect 客户端连接回调
OnConnect(cb SignalCallback)
// OnClose 连接断开回调
OnClose(cb SignalCallback)
// Run 运行signal server
Run() error
}
type Session interface {
// ID 获取SessionId
ID() string
// On 自定义事件回调
On(header string, cb SessionCallback)
// Emit 发送消息
Emit(header string, body string) error
// Close 关闭连接
Close()
}
// 此处certFile keyFile必填
signal := webtrans.NewSignal(9998, "key/server.cer", "key/server.key")
signal.OnConnect(func(session proto.Session) {
zap.L().Info("客户端连接")
go func() {
for true {
now := time.Now()
err := session.Emit("PING", strconv.FormatInt(now.UnixMilli(), 10))
if nil != err {
break
}
time.Sleep(time.Second)
}
}()
//session.On("*",...) 代表监听所有事件
session.On("PING", func(cbStruct proto.SessionCbStruct) {
zap.L().Info("get data", zap.String("data", cbStruct.Msg))
_ = session.Emit("PONG", cbStruct.Msg)
})
})
signal.OnClose(func(session proto.Session) {
zap.L().Info("客户端断开")
})
err := signal.Run()
if nil != err {
zap.L().Error("start fail", zap.Error(err))
}
//此处certFile keyFile可为空
signal := ws.NewSignal(9997, "key/server.cer", "key/server.key")
signal.OnConnect(func(session proto.Session) {
zap.L().Info("客户端连接")
go func() {
for true {
now := time.Now()
err := session.Emit("PING", strconv.FormatInt(now.UnixMilli(), 10))
if nil != err {
break
}
time.Sleep(time.Second)
}
}()
//session.On("*",...) 代表监听所有事件
session.On("PING", func(cbStruct proto.SessionCbStruct) {
zap.L().Info("get data", zap.String("data", cbStruct.Msg))
_ = session.Emit("PONG", cbStruct.Msg)
})
})
signal.OnClose(func(session proto.Session) {
zap.L().Info("客户端断开")
})
err := signal.Run()
if nil != err {
zap.L().Error("start fail", zap.Error(err))
}
STD_LOG=true 控制台输出日志
ws.html websocket实现
webtrans.html webtransport实现