{"id":25322514,"url":"https://github.com/chenjunpc2008/go-tcp","last_synced_at":"2025-04-07T22:23:01.962Z","repository":{"id":61625965,"uuid":"541979842","full_name":"chenjunpc2008/go-tcp","owner":"chenjunpc2008","description":"Go TCP Server library","archived":false,"fork":false,"pushed_at":"2024-09-04T02:12:14.000Z","size":26,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-13T23:44:37.463Z","etag":null,"topics":["go","golang","tcp","tcp-client","tcp-server"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chenjunpc2008.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-09-27T08:26:28.000Z","updated_at":"2024-09-04T02:05:48.000Z","dependencies_parsed_at":"2024-06-20T14:04:45.889Z","dependency_job_id":"684256e0-2edc-422b-8caf-3f81b084c5ff","html_url":"https://github.com/chenjunpc2008/go-tcp","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenjunpc2008%2Fgo-tcp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenjunpc2008%2Fgo-tcp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenjunpc2008%2Fgo-tcp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenjunpc2008%2Fgo-tcp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chenjunpc2008","download_url":"https://codeload.github.com/chenjunpc2008/go-tcp/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247738285,"owners_count":20987830,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","golang","tcp","tcp-client","tcp-server"],"created_at":"2025-02-13T23:41:01.774Z","updated_at":"2025-04-07T22:23:01.935Z","avatar_url":"https://github.com/chenjunpc2008.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# go-tcp\nGo TCP library: \u003chttps://github.com/chenjunpc2008/go-tcp\u003e\n\n## tcpclient\nGo TCP client\n\n```\naccepting connection:\n\n+------------+    +-----------------------------+    +----------------+\n|            |    |                             |    |                |\n|            |    |                             |    |                |\n| tcp client |---\u003e| establish remote connection |---\u003e| create session |\n|            |    |                             |    |                |\n|            |    |                             |    |                |\n+------------+    +-----------------------------+    +----------------+\n\nin session:\n\n+-----------------+    +----------------------+    +-------------------------+    +------------+\n|                 |    | Handler.Depack()     |    |                         |    |            |\n| read connection |---\u003e| unpack packet payload|---\u003e| Handler.OnReceiveData() |---\u003e| user logic |\n|                 |    |                      |    |                         |    |            |\n+-----------------+    +----------------------+    +-------------------------+    +------------+\n\n+------------+    +-----------------------+    +---------------------+    \n|            |    |                       |    | Handler.Pack()      | \n| user logic |---\u003e| client.SendToServer() |---\u003e| pack packet payload |\n|            |    |                       |    |                     | \n+------------+    +-----------------------+    +---------------------+\n                                                           |\n+------------------------+    +------------------+         |\n|                        |    |                  |         |\n| Handler.OnSendedData() |\u003c---| write connection |\u003c--------|\n|                        |    |                  |   \n+------------------------+    +------------------+  \n```\n\n## tcpserver\nGo TCP server\n\n```\naccepting connection:\n\n+------------+    +-------------------+    +----------------+\n|            |    |                   |    |                |\n|            |    |                   |    |                |\n| tcp server |---\u003e| accept connection |---\u003e| create session |\n|            |    |                   |    |                |\n|            |    |                   |    |                |\n+------------+    +-------------------+    +----------------+\n\nin session:\n\n+-----------------+    +----------------------+    +-------------------------+    +------------+\n|                 |    | Handler.Depack()     |    |                         |    |            |\n| read connection |---\u003e| unpack packet payload|---\u003e| Handler.OnReceiveData() |---\u003e| user logic |\n|                 |    |                      |    |                         |    |            |\n+-----------------+    +----------------------+    +-------------------------+    +------------+\n\n+------------+    +--------------------------+    +---------------------+    \n|            |    |                          |    | Handler.Pack()      | \n| user logic |---\u003e| tcpserver.SendToClient() |---\u003e| pack packet payload |\n|            |    |                          |    |                     | \n+------------+    +--------------------------+    +---------------------+\n                                                           |\n+------------------------+    +------------------+         |\n|                        |    |                  |         |\n| Handler.OnSendedData() |\u003c---| write connection |\u003c--------|\n|                        |    |                  |   \n+------------------------+    +------------------+  \n```\n\n# benchmark\nUse ```example/pressure-server``` and ```example/pressure-client```, ```1000 concurrent clients```, ```4 KB payload``` get a result of ```100000 q/s```.\n\n# Usage\n\n## tcpserver\n---\nfor example: ```example/pressure-server```\n\n1. Create your own tcp protocol package pack/depack(or Marshal/Unmarshal) method for tcp transport\n2. Create a struct for server event call back, and put your own tcp protocol package pack/depack method in Pack()/Depack()\n    ```go\n    type appHandler struct {\n    }\n\n    // pack message into the []byte to be written\n    func (hdl *appHandler) Pack(msg interface{}) ([]byte, error) {\n        const ftag = \"appHandler.Pack()\"\n\n        // TODO: Do your message pack here -- msg to []byte sends to client\n\n        var (\n            ok   bool\n            buff []byte\n            sErr string\n        )\n\n        buff, ok, sErr = echoprotocol.Pack(msg, 0)\n        if ok {\n            return buff, nil\n        }\n\n        return buff, fmt.Errorf(\"echoprotocol.Pack() error %s\", sErr)\n    }\n\n    // depack the message packages from read []byte\n    func (hdl *appHandler) Depack(rawData []byte) ([]byte, []interface{}) {\n        const ftag = \"appHandler.Depack()\"\n\n        // TODO: Do your message depack here -- []byte to msg receive from client\n\n        var (\n            dataRemain []byte\n            pakgs      []interface{}\n            ok         bool\n            errMsg     string\n        )\n\n        dataRemain, pakgs, ok, errMsg = echoprotocol.Depack(rawData)\n        if !ok {\n            // depack have err\n            log.Println(ftag, errMsg)\n        }\n\n        return dataRemain, pakgs\n    }\n\n    // new connections event\n    func (hdl *appHandler) OnNewConnection(serverIP string, serverPort uint16) {\n        const ftag = \"appHandler.OnNewConnection()\"\n        log.Println(ftag, serverIP, serverPort)\n    }\n\n    // disconnected event\n    func (hdl *appHandler) OnDisconnected(serverIP string, serverPort uint16) {\n        const ftag = \"appHandler.OnDisconnected()\"\n        log.Println(ftag, serverIP, serverPort)\n    }\n\n    // receive data event\n    func (hdl *appHandler) OnReceiveData(serverIP string, serverPort uint16, pPacks []interface{}) {\n        const ftag = \"appHandler.OnReceiveData()\"\n        // log.Println(ftag, serverIP, serverPort)\n    }\n\n    // data already sended event\n    func (hdl *appHandler) OnSendedData(serverIP string, serverPort uint16, msg interface{}, bysSended []byte, length int) {\n        const ftag = \"appHandler.OnSendedData()\"\n        // log.Println(ftag, serverIP, serverPort)\n    }\n\n    // event\n    func (hdl *appHandler) OnEvent(msg string) {\n        const ftag = \"appHandler.OnEvent()\"\n        log.Println(ftag, msg)\n    }\n\n    // error\n    func (hdl *appHandler) OnError(msg string, err error) {\n        const ftag = \"appHandler.OnError()\"\n        log.Println(ftag, msg, err)\n    }\n\n    // error\n    func (hdl *appHandler) OnErrorStr(msg string) {\n        const ftag = \"appHandler.OnErrorStr()\"\n        log.Println(ftag, msg)\n    }\n    ```\n3. Use the server and go\n    ```go\n    appHdl := \u0026appHandler{}\n    cnf := tcpserver.DefaultConfig()\n\n    gServer = tcpserver.NewTCPSvr(appHdl, cnf)\n\n    err = gServer.StartServer(uint16(gPort))\n    if nil != err {\n        log.Panicln(\"StartServer failed\", err)\n    }\n    ```\n\n\n## tcpclient\n---\nfor example: ```example/pressure-client```\n\n1. Create your own tcp protocol package pack/depack(or Marshal/Unmarshal) method for tcp transport\n2. Create a struct for server event call back, and put your own tcp protocol package pack/depack method in Pack()/Depack()\n    ```go\n    type appHandler struct {\n    }\n\n    // pack message into the []byte to be written\n    func (hdl *appHandler) Pack(msg interface{}) ([]byte, error) {\n        const ftag = \"appHandler.Pack()\"\n\n        // TODO: Do your message pack here -- msg to []byte sends to client\n\n        var (\n            ok   bool\n            buff []byte\n            sErr string\n        )\n\n        buff, ok, sErr = echoprotocol.Pack(msg, 0)\n        if ok {\n            return buff, nil\n        }\n\n        return buff, fmt.Errorf(\"echoprotocol.Pack() error %s\", sErr)\n    }\n\n    // depack the message packages from read []byte\n    func (hdl *appHandler) Depack(rawData []byte) ([]byte, []interface{}) {\n        const ftag = \"appHandler.Depack()\"\n\n        // TODO: Do your message depack here -- []byte to msg receive from client\n\n        var (\n            dataRemain []byte\n            pakgs      []interface{}\n            ok         bool\n            errMsg     string\n        )\n\n        dataRemain, pakgs, ok, errMsg = echoprotocol.Depack(rawData)\n        if !ok {\n            // depack have err\n            log.Println(ftag, errMsg)\n        }\n\n        return dataRemain, pakgs\n    }\n\n    // new connections event\n    func (hdl *appHandler) OnNewConnection(serverIP string, serverPort uint16) {\n        const ftag = \"appHandler.OnNewConnection()\"\n        log.Println(ftag, serverIP, serverPort)\n    }\n\n    // disconnected event\n    func (hdl *appHandler) OnDisconnected(serverIP string, serverPort uint16) {\n        const ftag = \"appHandler.OnDisconnected()\"\n        log.Println(ftag, serverIP, serverPort)\n    }\n\n    // receive data event\n    func (hdl *appHandler) OnReceiveData(serverIP string, serverPort uint16, pPacks []interface{}) {\n        const ftag = \"appHandler.OnReceiveData()\"\n        // log.Println(ftag, serverIP, serverPort)\n\n        // TODO: do your receive process here\n    }\n\n    // data already sended event\n    func (hdl *appHandler) OnSendedData(serverIP string, serverPort uint16, msg interface{}, bysSended []byte, length int) {\n        const ftag = \"appHandler.OnSendedData()\"\n        // log.Println(ftag, serverIP, serverPort)\n    }\n\n    // event\n    func (hdl *appHandler) OnEvent(msg string) {\n        const ftag = \"appHandler.OnEvent()\"\n        log.Println(ftag, msg)\n    }\n\n    // error\n    func (hdl *appHandler) OnError(msg string, err error) {\n        const ftag = \"appHandler.OnError()\"\n        log.Println(ftag, msg, err)\n    }\n\n    // error\n    func (hdl *appHandler) OnErrorStr(msg string) {\n        const ftag = \"appHandler.OnErrorStr()\"\n        log.Println(ftag, msg)\n    }\n    ```\n3. Use the client and go\n    ```go\n    appHdl := \u0026appHandler{}\n    cnf := tcpclient.DefaultConfig()\n\n    client := tcpclient.New(appHdl, cnf)\n\n    cnct_to := 3 * time.Second\n    err = client.ConnectToServer_Timeout(serverIP, serverPort, cnct_to)\n    if nil != err {\n        log.Panicln(\"ConnectToServer_Timeout failed\", err)\n    }\n\n    // send\n    busy, err = client.SendToServer(msg)\n    if nil != err {\n        log.Println(\"SendToServer failed\", err)\n        break\n    }\n\n    if busy {\n        log.Println(\"SendToServer failed because busy\")\n        break\n    }\n    ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenjunpc2008%2Fgo-tcp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchenjunpc2008%2Fgo-tcp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenjunpc2008%2Fgo-tcp/lists"}