A TCP Library use worker pool to improve performance and protect your server.
go get github.com/two/tspool
Build your server with tspool
package main
import (
"github.com/two/tspool""log""net"
)
funcmain() {
wp, err:=tspool.DefaultWorkerPool(100, 200)
iferr!=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)
iferr!=nil {
log.Fatalln(err)
}
}
funchandler(c net.Conn) {
addr:=c.RemoteAddr()
c.Write([]byte("hello"))
c.Close()
log.Println(addr.String())
}
funcerrHandler(c net.Conn, errstring) {
deferc.Close()
log.Fatalln("run server error: "+err)
}
funcrejectHandler(c net.Conn, errstring) {
deferc.Close()
log.Println("reject connect error: "+err)
}Build your tspool client
package main
import (
"log""net""sync""time"
)
varwg=new(sync.WaitGroup)
funcmain() {
varnumint=2000wg.Add(num)
fori:=0; i<num; i++ {
goconn()
}
wg.Wait()
log.Println("done")
}
funcconn() {
deferwg.Done()
addr:="0.0.0.0:8088"d:= net.Dialer{Timeout: 100*time.Millisecond}
conn, err:=d.Dial("tcp", addr)
iferr!=nil {
log.Fatalln(err)
}
deferconn.Close()
raddr:=conn.LocalAddr()
varr=make([]byte, 1024)
_, err=conn.Read(r)
iferr!=nil {
log.Printf(raddr.String() +" read error: "+err.Error())
}
log.Printf(raddr.String() +" got "+string(r))
}