# signal **Repository Path**: DreamPublic/signal ## Basic Information - **Project Name**: signal - **Description**: 信令 支持websocket与webtransport - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-09 - **Last Updated**: 2022-03-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Signal信令传输 ## 特性 - 支持websocket webtransport datachannel - 类似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() } ``` - webtransport 模式demo ``` // 此处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)) } ``` - websocket 模式demo ``` //此处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)) } ``` - datachannel 模式demo ``` //此处certFile keyFile可为空 signal := dc.NewSignal(9992, 9993, "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("客户端断开") }) signal.OnAuth(func(auth proto.AuthCbStruct) bool { return true }) err := signal.Run() if nil != err { zap.L().Error("start fail", zap.Error(err)) } ``` - 环境变量 ``` STD_LOG=true 控制台输出日志 ``` - web实现 ``` ws.html websocket实现 webtrans.html webtransport实现 datachannel.html datachannel ```