gitee.com/quant1x/gox@v1.21.2/pool/example/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "net" 6 "os" 7 "os/signal" 8 "syscall" 9 "time" 10 11 "gitee.com/quant1x/gox/pool" 12 ) 13 14 const addr string = "127.0.0.1:8080" 15 16 func main() { 17 c := make(chan os.Signal) 18 signal.Notify(c, os.Interrupt, os.Kill, syscall.SIGUSR1, syscall.SIGUSR2) 19 go server() 20 //等待tcp server启动 21 time.Sleep(2 * time.Second) 22 client() 23 fmt.Println("使用: ctrl+c 退出服务") 24 <-c 25 fmt.Println("服务退出") 26 } 27 28 func client() { 29 30 //factory 创建连接的方法 31 factory := func() (interface{}, error) { return net.Dial("tcp", addr) } 32 33 //close 关闭连接的方法 34 close := func(v interface{}) error { return v.(net.Conn).Close() } 35 36 //创建一个连接池: 初始化2,最大连接5,空闲连接数是4 37 poolConfig := &pool.Config{ 38 InitialCap: 2, 39 MaxIdle: 4, 40 MaxCap: 5, 41 Factory: factory, 42 Close: close, 43 //连接最大空闲时间,超过该时间的连接 将会关闭,可避免空闲时连接EOF,自动失效的问题 44 IdleTimeout: 15 * time.Second, 45 } 46 p, err := pool.NewChannelPool(poolConfig) 47 if err != nil { 48 fmt.Println("err=", err) 49 } 50 51 //从连接池中取得一个连接 52 v, err := p.Get() 53 54 //do something 55 //conn=v.(net.Conn) 56 57 //将连接放回连接池中 58 p.Put(v) 59 60 //释放连接池中的所有连接 61 //p.Release() 62 63 //查看当前连接中的数量 64 current := p.Len() 65 fmt.Println("len=", current) 66 } 67 68 func server() { 69 l, err := net.Listen("tcp", addr) 70 if err != nil { 71 fmt.Println("Error listening: ", err) 72 os.Exit(1) 73 } 74 defer l.Close() 75 fmt.Println("Listening on ", addr) 76 for { 77 conn, err := l.Accept() 78 if err != nil { 79 fmt.Println("Error accepting: ", err) 80 } 81 fmt.Printf("Received message %s -> %s \n", conn.RemoteAddr(), conn.LocalAddr()) 82 //go handleRequest(conn) 83 } 84 }