通过实现一个简单的K–V存储数据库,学习Go语言(五)
优化客户端端口重连
优化服务端断开问题
下一步优化—-使用协程发送消息
- 服务端
func main() {
//net.Listen() 函数用于监听连接,如果第二个参数不包含 IP 地址,只有端口号的话,net.Listen()
//将监听本地系统上所有可用的 IP 地址。
listen, err := net.Listen("tcp", "localhost:5000")
fmt.Println("myRedis localhost:5000 启动...")
if err != nil {
fmt.Println(err)
return
}
defer listen.Close()
for {
//多次连接
conn, err := listen.Accept()
if err != nil {
fmt.Println(err)
continue
}
fmt.Println("客户端连接成功啦!")
for {
//获取客户端发来的消息
data, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
//断开,重新连接,开启新连接
fmt.Printf("客户端断开连接...\n%s", err)
conn.Close()
break
}
//strings.TrimSpace(data)去掉字符串的 回车 13 换行符 10
sendMsg := myRedis(strings.TrimSpace(data))
fmt.Println("接受客户端消息为:", strings.TrimSpace(data), []byte(data), []byte(strings.TrimSpace(data)))
//发送给客户端
if sendMsg != "" {
conn.Write([]byte(sendMsg + "\n"))
}
}
}
}
- 客户端
func main() {
//连接服务端
conn, err := net.Dial("tcp", "localhost:5000")
if err != nil {
fmt.Println(err)
return
}
for {
//通过io输入消息给服务端
reader := bufio.NewReader(os.Stdin)
fmt.Print(">>")
//分行发送消息
text, _ := reader.ReadString('\n')
//标准格式,通过conn数据发送
//fmt.Fprintf(conn, text)
conn.Write([]byte(text))
//读取接受消息
acceptMsg, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
fmt.Printf("服务端端断开连接...\n%s", err)
conn.Close()
break
}
fmt.Print(acceptMsg)
}
}