IT科技类资讯

徒手用 Go 写个 Redis 服务器

时间:2010-12-5 17:23:32  作者:应用开发   来源:系统运维  查看:  评论:0
内容摘要:复制funcListenAndServe(addressstring){ //绑定监听地址 listener,err:=net.Listen("tcp",a

徒手用 Go 写个 Redis 服务器
复制func ListenAndServe(address string) {       // 绑定监听地址      listener,徒手 err := net.Listen("tcp", address)      if err != nil {           log.Fatal(fmt.Sprintf("listen err: %v", err))      }      defer listener.Close()      log.Println(fmt.Sprintf("bind: %s, start listening...", address))      for {           // Accept 会一直阻塞直到有新的连接建立或者listen中断才会返回          conn, err := listener.Accept()          if err != nil {               // 通常是由于listener被关闭无法继续监听导致的错误              log.Fatal(fmt.Sprintf("accept err: %v", err))          }          // 开启新的服务器租用 goroutine 处理该连接          go Handle(conn)      }  }  func Handle(conn net.Conn) {       reader := bufio.NewReader(conn)      for {           // ReadString 会一直阻塞直到遇到分隔符 \n         // 遇到分隔符后 ReadString 会返回上次遇到分隔符到现在收到的所有数据          // 若在遇到分隔符之前发生异常, ReadString 会返回已收到的数据和错误信息          msg, err := reader.ReadString(\n)          if err != nil {               // 通常遇到的站群服务器错误是连接中断或被关闭,用io.EOF表示              if err == io.EOF {                   log.Println("connection close")              } else {                   log.Println(err)              }              return         }          b := []byte(msg)          // 将收到的亿华云服务信息发送给客户端          conn.Write(b)      }  }  func main() {       ListenAndServe(":8000")  }  1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.
copyright © 2025 powered by 益强资讯全景  滇ICP备2023006006号-31sitemap