Golang Redis && Socket
一丶Redis
1 package redis_test 2 3 import ( 4 "fmt" 5 6 "github.com/gomodule/redigo/redis" 7 ) 8 9 // 安装 10 // go get github.com/gomodule/redigo/redis 11 var pool *redis.Pool 12 13 func init() { 14 // Redis连接池 15 pool = &redis.Pool{ 16 MaxIdle: 8, // 最大空闲连接数 17 MaxActive: 0, // 最大连接数 18 IdleTimeout: 100, // 最大空闲时间 19 Dial: func() (redis.Conn, error) { // 初始化连接的代码,连接哪个ip 20 return redis.Dial("tcp", "127.0.0.1:6379") 21 }, 22 } 23 24 // c := pool.Get() 25 // pool.Close() 26 } 27 28 func TestRedis() { 29 // 连接redis 30 conn := pool.Get() 31 // conn, err := redis.Dial("tcp", "127.0.0.1:6379") 32 defer conn.Close() 33 // if err != nil { 34 // fmt.Println("Redis 连接错误!", err) 35 // return 36 // } 37 fmt.Println("Redis 连接成功!:", conn) 38 39 // 写数据 40 _, err1 := conn.Do("Set", "name", "Tom") 41 if err1 != nil { 42 fmt.Println("Redis 写数据失败!", err1) 43 return 44 } 45 // 读数据 46 data, err2 := conn.Do("get", "name") 47 if err2 != nil { 48 fmt.Println("Redis 读数据失败!", err2) 49 return 50 } 51 52 // 需要数据断言.因为Do返回的是interface{} 53 data, err2 = redis.String(data, err2) 54 if err2 != nil { 55 fmt.Println("Redis 数据断言失败!", err2) 56 return 57 } 58 fmt.Println("Redis 读取到的数据:", data) 59 60 // 也可以这样一次解决 61 data, err2 = redis.String(conn.Do("get", "name")) 62 fmt.Println("Redis 读取到的数据:", data) 63 64 // 如果返回的多个元素就可以通过redis.Strings()来断言 65 }
二丶Socket
1 // server.go 2 package server 3 4 import ( 5 "encoding/binary" // 将任意基础类型转成butes切片 6 "fmt" 7 "io" 8 "net" 9 ) 10 11 /* 12 将uint32转成bytes 13 */ 14 func intToBytes(data uint32) (rdata [4]byte) { 15 binary.BigEndian.PutUint32(rdata[:4], data) 16 var ui uint32 17 ui = binary.BigEndian.Uint32(rdata[:4]) 18 fmt.Println(ui) 19 return 20 } 21 22 func process(conn net.Conn) { 23 // 延时关闭 24 defer conn.Close() 25 fmt.Printf("-------与'%v'客户端建立连接.\n", conn.RemoteAddr()) 26 defer fmt.Printf("-------与'%v'客户端断开连接.\n", conn.RemoteAddr()) 27 28 for { 29 buf := make([]byte, 1024) 30 fmt.Printf("-------等待'%v'客户端发送消息.\n", conn.RemoteAddr()) 31 // 如果没有收到客户端发送来的数据,就会一致堵塞在这里 32 n, err := conn.Read(buf) 33 if err != nil { 34 if err == io.EOF { 35 return 36 } 37 fmt.Printf("-------接受'%v'客户端发送消息出现错误:%v.\n", conn.RemoteAddr(), err) 38 continue 39 } 40 // 显示接受到客户端的数据 41 fmt.Printf("-------收到'%v'的数据长度:%v, 数据内容:%v\n", conn.RemoteAddr(), n, string(buf[:n])) 42 } 43 } 44 45 func StartServer() { 46 fmt.Println("-------start Server---------") 47 defer fmt.Println("-------stop Server---------") 48 // tcp网络协议,监听本地9656端口 49 listen, err := net.Listen("tcp", "0.0.0.0:9656") 50 if err != nil { 51 fmt.Println("-------tcp网络协议,监听本地9656端口发生错误:", err) 52 return 53 } 54 defer listen.Close() 55 56 fmt.Println("-------net.Listen('tcp', '0.0.0.0:9656')的返回值listen:", listen) 57 fmt.Println() 58 fmt.Println() 59 // 循环等待客户端的连接 60 for { 61 fmt.Println("-------等待客户端连接...---------") 62 conn, err := listen.Accept() 63 if err != nil { 64 fmt.Println("-------Accept()客户端连接失败:", err) 65 continue 66 } 67 fmt.Println("-------Accept()客户端连接成功:", conn) 68 go process(conn) 69 } 70 71 }
1 // client.go 2 package client 3 4 import ( 5 "bufio" 6 "fmt" 7 "net" 8 "os" 9 ) 10 11 func StartClient() { 12 fmt.Println("-------Client start Server---------") 13 conn, err := net.Dial("tcp", "127.0.0.1:9656") 14 if err != nil { 15 fmt.Println("-------net.Dial('tcp', '127.0.0.1:9656')连接服务器失败:", err) 16 return 17 } 18 fmt.Println("-------net.Dial('tcp', '127.0.0.1:9656')连接服务器返回的conn:", conn) 19 defer conn.Close() 20 defer fmt.Println("-------Client stop Server---------") 21 22 // 功能一:客户端向服务器发送但行数据,然后退出 23 24 reader := bufio.NewReader(os.Stdin) // os.Stdin代表终端的标准输入 25 for { 26 // 获取一行终端输入 27 fmt.Println("请输入要发送到服务器的内容:") 28 line, err := reader.ReadString('\n') 29 if err != nil { 30 fmt.Println("-------读取终端输入出现错误:", err) 31 return 32 } 33 line = line[:len(line)-1] 34 fmt.Printf("-------读取终端输入的内容是:%v, 类型是:%T\n", line, line) 35 if line == "exit" { 36 return 37 } 38 // 将输入的数据发送到服务器 39 n, err := conn.Write([]byte(line)) 40 if err != nil { 41 fmt.Printf("-------将'%v'发送到服务器失败:\n", err) 42 return 43 } 44 fmt.Printf("-------将'%v'发送到服务器成功.发送数据的长度:%v\n", line, n) 45 } 46 47 }