GitHub - two/tspool: tcp server pool (original) (raw)

tspool

A TCP Library use worker pool to improve performance and protect your server.

Build Status Code Coverage License GoDoc

Install

go get github.com/two/tspool

Usage

Build your server with tspool

server

package main

import ( "github.com/two/tspool" "log" "net" )

func main() { wp, err := tspool.DefaultWorkerPool(100, 200) if err != nil { log.Fatalln(err) } server := &tspool.Server{ Addr: "0.0.0.0:8088", Handler: handler, ErrHandler: errHandler, WorkerPool: wp, RejectHandler: rejectHandler, } err = tspool.ListenAndServe(server) if err != nil { log.Fatalln(err) } }

func handler(c net.Conn) { addr := c.RemoteAddr() c.Write([]byte("hello")) c.Close() log.Println(addr.String()) }

func errHandler(c net.Conn, err string) { defer c.Close() log.Fatalln("run server error: " + err) }

func rejectHandler(c net.Conn, err string) { defer c.Close() log.Println("reject connect error: " + err) }

Build your tspool client

package main

import ( "log" "net" "sync" "time" )

var wg = new(sync.WaitGroup)

func main() { var num int = 2000 wg.Add(num) for i := 0; i < num; i++ { go conn() } wg.Wait() log.Println("done") } func conn() { defer wg.Done() addr := "0.0.0.0:8088" d := net.Dialer{Timeout: 100 * time.Millisecond} conn, err := d.Dial("tcp", addr) if err != nil { log.Fatalln(err) } defer conn.Close() raddr := conn.LocalAddr() var r = make([]byte, 1024) _, err = conn.Read(r) if err != nil { log.Printf(raddr.String() + " read error: " + err.Error()) } log.Printf(raddr.String() + " got " + string(r)) }

Define your own worker pool and worker

Example

example