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 }

 

posted @ 2023-11-19 03:21  看一百次夜空里的深蓝  阅读(21)  评论(0编辑  收藏  举报