go网络编程
服务器端server.go
import "net"
// 为每一个客户端请求开启协程
func process(conn net.Conn) {
defer conn.Close() //关闭连接
for {
buf := make([]byte, 1024)
//等待读取conn里的client消息,如果没收到消息会阻塞,n代表读到的字节数
n,err := conn.Read(buf)
// 将收到的client信息打印,注意1:必须是Print因为从client读取时已带换行换行,真正读取的数据到n为止
fmt.Print(string(buf[:n]))
}
}
func main() {
// 服务器监听8000端口
listen, err = net.Listen("tcp", 0.0.0.0:8000)
defer listen.Close()
// 等待客户端连接
for {
conn, err = listen.Accept()
// 得到客户端的ip和port
ip_port := conn.RemoteAddr().string
go process(conn)
}
}
客户端client.go
import "net"
import "bufio"
func main() {
// server端的ip和port
conn, err = net.Dial("tcp", 192.168.1.10:8888)
// 客户端发送数据到服务器
// ①:client先从终端获取标准输入
reader,err := bufio.NewReader(os.Stdin)
line,err := reader.ReadString('\n') // 以换行作为终止标志
// ②:将读取的数据发给server,参数是byte类型的切片,返回的是字符串
n,err := conn.Write([]byte(line))
fmt.Printf("发送给server的数据:%v", n)
}
Redis
-
默认端口6379
-
切换数据库:select 1
-
添加数据:set name amber 默认添加到数据库0
-
清空当前数据库:flushdb
-
清空所有数据库:flushall
-
删除一组数据:del name
-
同时设置多个值:mset name amber age 10
-
同时获取多个值:mget name age
-
哈希给对象赋值:hset user1 name amber
-
哈希获取对象值:hget user1 “name”
-
哈希一次获取全部信息:hgetall user1
-
哈希一次全部赋值:hmset user2 name “lucy” age 44 job “java”
-
哈希一次获取多个:hmget user2 name age
-
哈希查看对象设置几个属性:hlen user2
-
哈希查看对象是否有指定字段:hexist user name
Redis List:一个key可对应多个value
- List插入(左侧):hpush num 1 2 3
- List插入(右侧):rpush num 1 2 3
- List获取全部:lrange 0 -1
- List弹出(最左侧):lpop num
- List弹出(最右侧):rpop num
- List删除:del num
- List长度:llen num
Redis Set:无序
- 插入:sadd name amber bella mike
- 追加插入:sadd name mike 提示添加失败
- 查看:smembers name
- 查看指定数据是否存在key中:sismember name mike
- 删除指定数据bella:srem name bella
go连接Redis
import "github.com/xxx/redis"
func main() {
// go连接redis
conn,er := redis.Dial("tcp", "192.168.1.10:6379")
defer conn.Close()
// 向redis写入数据,返回值是空接口类型,set首字母大小写随意
_,err = conn.Do("set", "name", "amber")
// res对应的是空接口类型,需要类型转换
res,err := redis.String(conn.Do("get", "name"))
// 上述的set/get均可更换成hset/hget等方式
}
Redis连接池
定义:连接池里创建多个conn,也不关闭,每次client请求连接时直接从连接池获取,减少因关闭而消耗资源
import "github.com/xxx/redis"
var pool *redis.Pool //定义全局pool
// 程序启动时初始化连接池
func init() {
pool = &redis.Pool{
MaxIdle : 8, //最大空闲数
MaxActice : 0, //最大连接数,0代表不限制
IdleTimeout : 100, //中断连接超过100s,放回连接池
Dial : func() (redis.Conn{}, err){
return redis.Dial("tcp", "192.168.1.10:6379") //初始化连接,指定主机
}
}
}
func main() {
// 从pool取出连接
conn := pool.Get()
defer conn.Close()
_, err := conn.Do("set", "name", "amber")
r, err := redis.String(conn.Do("get", "name"))
fmt.Println("name=", r)
}
// pool要始终保持开启,不可关闭