TaoGo 實現(xiàn)的 TCP 異步框架
Tao 是一個輕量級的 TCP 異步框架,使用 Go 語言實現(xiàn),
1. Tao解決什么問題
1.1 場景
你開發(fā)的產(chǎn)品有一套特有的業(yè)務(wù)邏輯,要通過互聯(lián)網(wǎng)得到服務(wù)端的支持才能為你的客戶提供服務(wù)。
1.2 問題
怎樣快速穩(wěn)定地實現(xiàn)產(chǎn)品的功能,而不需要耗費(fèi)大量的時間處理各種底層的網(wǎng)絡(luò)通信細(xì)節(jié)。
1.3 解決方案
Tao提供了一種用框架支撐業(yè)務(wù)邏輯的機(jī)制。你只需要與客戶端定義好消息格式,然后將對應(yīng)的業(yè)務(wù)邏輯編寫成函數(shù)注冊到框架中就可以了。
2. 50行啟動一個聊天服務(wù)器
讓我們舉一個例子來看看如何使用Tao框架實現(xiàn)一個簡單的群聊天服務(wù)器。服務(wù)器端代碼可以這么寫:
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)
}
}
啟動一個服務(wù)器只需要三步就能完成。首先注冊消息和業(yè)務(wù)邏輯回調(diào),其次填入IP地址和端口,最后Start一下就可以了。這時候客戶端就能夠發(fā)起連接,并開始聊天。業(yè)務(wù)邏輯的實現(xiàn)很簡單,遍歷所有的連接,然后發(fā)送數(shù)據(jù):
// 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)
}
}評論
圖片
表情
