1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        TaoGo 實現(xiàn)的 TCP 異步框架

        聯(lián)合創(chuàng)作 · 2023-09-29 12:23

        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)
            }
        }
        瀏覽 22
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        編輯 分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        編輯 分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日胖逼| 日本办公室激情 | 北条麻妃操逼 | 国产成人无码精免费视频 | 在线免费操逼 | 亚洲精品网站 在线播放glf | 轻轻挺进女教师的身体电影 | wwwA片 | 精品国产999久久久免费 | 欧美BBw搡BBBB搡BBBB |