软件简介

Tao 是一个轻量级的 TCP 异步框架,使用 Go 语言实现,

1. Tao解决什么问题

1.1 场景

你开发的产品有一套特有的业务逻辑,要通过互联网得到服务端的支持才能为你的客户提供服务。

1.2 问题

怎样快速稳定地实现产品的功能,而不需要耗费大量的时间处理各种底层的网络通信细节。

1.3 解决方案

Tao提供了一种用框架支撑业务逻辑的机制。你只需要与客户端定义好消息格式,然后将对应的业务逻辑编写成函数注册到框架中就可以了。

2. 50行启动一个聊天服务器

让我们举一个例子来看看如何使用Tao框架实现一个简单的群聊天服务器。服务器端代码可以这么写:

package main

import (
    "fmt"
    "net"

    "github.com/leesper/holmes"
    "github.com/leesper/tao"
    "github.com/leesper/tao/examples/chat"
)

// ChatServer is the chatting server.
type ChatServer struct {
    *tao.Server
}

// NewChatServer returns a ChatServer.
func NewChatServer() *ChatServer {
    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")
    })
    return &ChatServer{
        tao.NewServer(onConnectOption, onErrorOption, onCloseOption),
    }
}

func main() {
    defer holmes.Start().Stop()

    tao.Register(chat.ChatMessage, chat.DeserializeMessage, chat.ProcessMessage)

    l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", "0.0.0.0", 12345))
    if err != nil {
        holmes.Fatalln("listen error", err)
    }
    chatServer := NewChatServer()
    err = chatServer.Start(l)
    if err != nil {
        holmes.Fatalln("start error", err)
    }
}

启动一个服务器只需要三步就能完成。首先注册消息和业务逻辑回调,其次填入IP地址和端口,最后Start一下就可以了。这时候客户端就能够发起连接,并开始聊天。业务逻辑的实现很简单,遍历所有的连接,然后发送数据:

// ProcessMessage handles the Message logic.
func ProcessMessage(ctx context.Context, conn tao.WriteCloser) {
    holmes.Infof("ProcessMessage")
    s, ok := tao.ServerFromContext(ctx)
    if ok {
        msg := tao.MessageFromContext(ctx)
        s.Broadcast(msg)
    }
}
展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (0)

加载中
更多评论
暂无内容
发表了博客
2013/05/27 18:59

Tao of Spring Roo

#Tao of Spring Roo # As you see, Spring Roo is not only a simple scollad tool for code generation, it also try to introduce a new programming model. ##AspectJ and AOP programming## Roo is heavily dependent on AspectJ, the famous AOP framework, which is a subproject of [Eclipse.org](http://www.ecl...

0
0
发表于开发技能专区
2016/11/25 12:56

reviewboard+tao-reviewboard代码重构安装以及资料下载

安装细节都在以下资料中,按资料中的步骤安装即可。 资料下载链接:http://pan.baidu.com/s/1cy00Dg

0
0
05/27 22:32

改变多目标跟踪领域!CMU等推出大规模多类别MOT数据集TAO

#多目标跟踪# #数据集# TAO: A Large-Scale Benchmark for Tracking Any Object 大规模类别多样的多目标跟踪数据集TAO 在多目标跟踪领域类别往往来自自动驾驶和视频监控中特定的几个类(车辆、行人、动物等),忽...

0
0
发表了博客
2019/12/07 12:23

OpenTK学习笔记:C#的中开发OpenGL程序的4种开源封包库SharpGL、CsGL、OpenTK、Tao框架的简单对比

  最近要在C#的语言环境下开发OpenGL程序,参考了网上的博客论坛http://www.cnblogs.com/hanyonglu/archive/2012/06/12/2546581.html,总结如下: 1.在C#中直接调用OpenGL函数比较费事,一般不直接使用; 2.一般的开发方法是借助第三方开源库,比如SharpGL、CsGL、OpenTK、Tao框架等。其中Tao框架框架已经停止维护和更...

0
0
发表了博客
08/11 16:27

再看<T>与<?>和“extends”与“super” 之 上次简单整理了“T”,是不是提到“T”就想到了Java的优越感——安全(Tao)问题

感觉 < T > 和 < ? > 一样 ? 先看个荔枝: 将所有< ? >替换成< T > : 发现 < ? > 替换成 < T > 后报错了,看来还是不一样。那看看有什么联系和区别吧 (1)< T >可以用extends限定; (2)< ? >可以用extends和super 限定; (extends限定为所绑定的类及其子类,super限定为所绑定的类及其父类) (3)替换作用; 简单省事,...

0
0
发表了博客
2014/11/02 09:57

从零开始写个编译器吧 - 从何处下手

作为本系列的第一章,将考虑从何开始下手。既然写的是编译器,那在此得明确编译器长什么样子,进一步,编译器由哪几部分构成,其工作原理大概是怎样的。了解了这些,才好下手。 简单来说,编译器本身是一个程序,这个程序能将一种代码(源代码)翻译成另一种代码(目标代码)。简而言之就是如下图。 而本系列中设计出来以...

0
2
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
9 收藏
分享
返回顶部
顶部