golang(tao框架)

客户端:

package main

import (

"context"

"errors"

"fmt"

"net"

"time"

"github.com/leesper/holmes"

"github.com/leesper/tao"

"github.com/leesper/tao/examples/echo"

)

//模拟信息的结构体

type SimulatorMessage struct {

Message []byte

}

var (

ErrorNilData    error = errors.New("Nil data")

simulatorMessage SimulatorMessage

)

//初始化方法

func init() {

simulatorData := []byte{0x40, 0x40, 0x40, 0x42, 0x31, 0x36, 0x42, 0x30,

0x31, 0x41, 0x30, 0x30, 0x31, 0x58, 0x30, 0x30, 0x31, 0x5A, 0x10, 0x02,

0x51, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x64, 0x00, 0x00, 0x10,

0x03, 0x4F, 0xDF, 0x00, 0x00, 0x23, 0x23, 0x23}

//simulatorData = append(simulatorData, 0x44, 0x40, 0x40, 0x42, 0x31)

simulatorMessage = SimulatorMessage{Message: simulatorData}

}

func main() {

//默认开始和停止放到最前面

defer holmes.Start().Stop()

//tao框架注册消息(模拟信息的数量、反序列化输出信息、过程信息处理)

tao.Register(SimulatorMessage{}.MessageNumber(), DeserializeEchoMessage, ProcessPingPongMessage)

//拨号

c, err := net.Dial("tcp", "127.0.0.1:18341")

if err != nil {

//打印致命的日志和退出。

holmes.Fatalln(err)

}

//返回服务端选项将设置回调时调用新的客户端连接。

onConnect := tao.OnConnectOption(func(conn tao.WriteCloser) bool {

holmes.Infoln("on connect")

return true

})

//返回服务端选项将设置回调调用时出错发生。

onError := tao.OnErrorOption(func(conn tao.WriteCloser) {

holmes.Infoln("on error")

})

//返回服务端选项将设置回调时要调用的客户端关闭。

onClose := tao.OnCloseOption(func(conn tao.WriteCloser) {

holmes.Infoln("on close")

})

//返回服务端选项将设置回调时调用新的消息到达。

onMessage := tao.OnMessageOption(func(msg tao.Message, conn tao.WriteCloser) {

echo := msg.(echo.Message)

fmt.Printf("%s\n", echo.Content)

})

//客户端返回一个新的客户端连接并没有开始服务请求。

conn := tao.NewClientConn(0, c, onConnect, onError, onClose, onMessage)

conn.Start()

for i := 0; i < 100; i++ {

fmt.Printf("simulatorMessage %v \n", simulatorMessage)

time.Sleep(600 * time.Millisecond)

err := conn.Write(simulatorMessage)

if err != nil {

holmes.Errorln("%v", err)

}

}

time.Sleep(time.Second)

conn.Close()

}

//模拟信息序列化

func (em SimulatorMessage) Serialize() ([]byte, error) {

return em.Message, nil

}

//模拟信息数量

func (em SimulatorMessage) MessageNumber() int32 {

return 1

}

//过程信息处理

func ProcessPingPongMessage(ctx context.Context, conn tao.WriteCloser) {

//  rsp := ctx.Message().(pingpong.PingPongMessage)

//  rspChan<- rsp.Info

// fmt.Printf("ctx : %v \n", ctx.Message())

}

//反序列化输出信息

func DeserializeEchoMessage(data []byte) (message tao.Message, err error) {

if data == nil {

return nil, ErrorNilData

}

msg := SimulatorMessage{

Message: data,

}

fmt.Printf("接收服务端数据  : %v \n", data)

return msg, nil

}



服务端:

package main

import (

"fmt"

"net"

"os"

"os/signal"

"runtime"

"syscall"

"DeviceManagement-Service/common/setting"

"DeviceManagement-Service/device"

"DeviceManagement-Service/projectInit"

log "github.com/cihub/seelog"

"github.com/leesper/holmes"

"github.com/leesper/tao"

)

//定义一个数据库变量

var (

serverConf *setting.ServerCfg

)

//驱动服务的结构体

type DeviceServer struct {

*tao.Server

}

//服务端初始化方法

func init() {

//项目初始化的log日志

projectInit.Logger()

//获取服务器的配置文件信息

serverConf, _ = projectInit.GetServerConf()

}

//返回一个新的设备服务

func NewDeviceServer() *DeviceServer {

//返回服务端选项将设置回调时调用新的客户端连接。

onConnectOption := tao.OnConnectOption(func(conn tao.WriteCloser) bool {

holmes.Infoln("on connect")

return true

})

//返回服务端选项将设置回调调用时出错发生。

onErrorOption := tao.OnErrorOption(func(conn tao.WriteCloser) {

holmes.Infoln("on error")

})

//返回服务端选项将设置回调时要调用的客户端关闭。

onCloseOption := tao.OnCloseOption(func(conn tao.WriteCloser) {

holmes.Infoln("close chat client")

})

//服务端返回一个新的TCP服务器没有启动为请求服务。

return &DeviceServer{

tao.NewServer(onConnectOption, onErrorOption, onCloseOption),

}

}

func main() {

log.Info("启动上位机")

runtime.GOMAXPROCS(runtime.NumCPU())

//默认开始和停止放到最前面

defer holmes.Start().Stop()

// tao.MonitorOn(12345)

//tao框架注册消息(设备信息的数量、反序列化输出设备信息、过程设备信息处理)

tao.Register(device.DeviceMessage{}.MessageNumber(), device.DeserializeDeviceMessage, device.ProcessDeviceMessage)

//tao.Register(device.DEVICE_MESSAGE, device.ProcessDeviceMessage)

//监听端口

l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", "0.0.0.0", serverConf.Port))

if err != nil {

holmes.Fatalln("listen error", err)

}

deviceServer := NewDeviceServer()

go func() {

c := make(chan os.Signal, 1)//有缓冲通道signal信号量

signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)//信号通知

<-c

deviceServer.Stop()

}()

err = deviceServer.Start(l)

if err != nil {

//打印致命的日志和退出。

holmes.Fatalln("start error", err)

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容