GO实现TCP服务器
首先新建一个项目go-redis,将config和lib包放到项目中,config.go用来解析配置,比如端口、功能、DB数;lib包有两个文件夹,分别是logger和sync,其中logger.go是一个日志框架,sync包中的bool.go包装了atomic操作,因为atomic原生没有bool类型,所以将uint32类型改造成bool型的atomic,wait.go包装了WaitGroup等待组,多做的工作是将等待组增加一个超时功能,redis.conf配置文件写明我们redis要写在的端口和监听地址
正式开始
- 新建一个接口文件夹,放一些全局用到的接口,首先是TCP层的handler.go,这个接口的目的是让handler.go代表一个抽象的业务逻辑,让TCP服务器只处理TCP层的连接,具体的业务扔给handler去做
type Handler interface {
Handle(ctx context.Context, conn net.Conn)
Close() error
}
TCP服务器开发
server.go
net.listen服务器监听端口地址,如果监听成功就调用Accept阻塞等待客户端连接,但这里我们将listener传给ListenAndServe方法,该方法传入三个参数,分别是listener,处理客户端业务的handler和传递关闭信号的channel,在其中for循环阻塞等待客户端连接,新的客户端过来后一个协程一个连接,将上下文ctx和conn句柄传入handler.Handle方法,然后我们只需在main函数里调用ListenAndServeWithSignal方法即可,但此时连接关闭和用户关闭窗口统一关闭所有客户端连接功能我们还没有处理文章来源:https://www.toymoban.com/news/detail-605757.html
接下来我们就要着手改进,第一点就是我们这个for循环在不断阻塞接收新的连接,如果接收新连接出现错误后直接break,但此时我们已经有一些连接正在服务,所以我们需要等待已经连接的客户端退出,这里我们就要用到WaitGroup等待组,具体用法就是在每接收一个新的客户端连接后WaitGroup.Add(1),在接收新连接出错也就是break跳出fo文章来源地址https://www.toymoban.com/news/detail-605757.html
到了这里,关于Go重写Redis中间件 - GO实现TCP服务器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!