0%

通过Go+Map写k-v数据库(SET-GET简单实现TCP优化版)

通过实现一个简单的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)
	}
}
-------------本文结束感谢您的阅读-------------
打赏一瓶矿泉水