自定义的Server实例和默认的DefaultServer
扫描二维码
随时随地手机看文章
Server类型的Accept方法和全局的Accept函数的作用如下
1. Server 类型的 Accept 方法
Server类型的Accept方法是一个实例方法,用于处理特定的Server实例。它接受一个net.Listener,并为每个新连接启动一个协程来处理请求。
-
作用
-
从net.Listener中接受新的连接。
-
为每个新连接启动一个协程,调用server.ServeConn(conn)来处理连接。
-
如果接受连接时发生错误,记录错误并退出循环。
2. 全局的 Accept 函数
全局的Accept函数是一个包装函数,用于提供默认行为。它调用了DefaultServer的Accept方法。
-
作用:
-
提供一个全局的Accept函数,方便用户使用默认的Server实例。
-
如果用户没有创建自己的Server实例,可以直接调用Accept函数来启动服务器。
-
3.为什么定义两个?
-
灵活性:
- Server类型的Accept方法允许用户创建自己的Server实例,并传入自定义的Server实例。
- 全局的Accept函数提供了一个默认的Server实例,方便用户快速启动服务器,而不需要手动创建Server实例。
-
默认行为:
- DefaultServer是一个全局的默认Server实例,通常在包初始化时创建。
- 全局的Accept函数允许用户在不需要自定义Server实例的情况下,直接使用默认的Server实例。
4.关键代码
type Server struct{}
var DefaultServer = &Server{}
func (server *Server) Accept(lis net.Listener) {
for {
conn, err := lis.Accept()
if err != nil {
log.Println("rpc server: accept error:", err) return } go server.ServeConn(conn)
}
}
func Accept(lis net.Listener) {
DefaultServer.Accept(lis)
}
在main函数中使用 Server 类型的 Accept 方法
// 创建一个自定义的 Server 实例
server := &Server{}
// 使用自定义的 Server 实例
server.Accept(listener)
在main函数中使用全局的 Accept 函数
// 使用默认的 Server 实例
Accept(listener)
Server类型的Accept方法:允许用户创建自己的Server实例,并传入自定义的Server实例。
全局的Accept函数:提供一个默认的Server实例,方便用户快速启动服务器,而不需要手动创建Server实例。
5.自定义的Server实例和默认的DefaultServer有什么区别?
自定义的Server实例
自定义的Server实例允许用户创建自己的Server对象,并根据需要对其进行配置和扩展。这提供了更高的灵活性和控制权,用户可以根据自己的需求定制服务器的行为。
优点
用户可以根据自己的需求配置服务器的行为,例如设置超时时间、中间件、日志记录等;用户可以扩展Server类型,添加自定义的方法和字段,以满足特定的需求;每个Server实例是独立的,用户可以同时运行多个不同的服务器实例,每个实例都有自己的配置和行为。
默认的DefaultServer实例
DefaultServer是一个全局的默认Server实例,通常在包初始化时创建。它提供了一个通用的服务器实例,用户可以直接使用而无需手动创建和配置。
优点
用户可以直接使用DefaultServer,而无需手动创建和配置服务器实例;DefaultServer提供了一组通用的默认配置,适用于大多数场景。