如何限制连接到我服务的客户端数量? 我试过一个简单的计数器,但如果客户端退出而没有关闭 他们的联系我不知道如何得到它。
请有人能给我一些想法才能得到它吗?
const MAX_CLIENTS = 5
var ConnectedClients int
func main() {
ConnectedClients = 0
server, err := net.Listen(CONN_TYPE, net.JoinHostPort(CONN_HOST, CONN_PORT))
if err != nil {
fmt.Println("Error Listening", err.Error())
os.Exit(1)
}
defer server.Close()
fmt.Println("Listening on ", net.JoinHostPort(CONN_HOST, CONN_PORT))
for {
conn, err := server.Accept()
if err != nil {
fmt.Println("Error acepting: ", err.Error())
os.Exit(1)
}
ConnectedClients += 1
fmt.Println("Connected with:", conn.RemoteAddr())
fmt.Println("Clients:", ConnectedClients)
if ConnectedClients > MAX_CLIENTS {
fmt.Println("Limit reached! Disconnecting:", conn.RemoteAddr())
conn.Close()
}
go handleRequest(conn)
}
}
func handleRequest(conn net.Conn) {
//This defer will never run.... :-(
defer func() {
fmt.Println("Connection closed with client:", conn.RemoteAddr())
ConnectedClients -= 1
conn.Close()
}()
...
...
}
答案 0 :(得分:0)
实际上,这可能是您未与我们分享的代码中的问题(那些......)
连接将会退出 - 迟早。假设您的连接处理程序中必须执行一些读/写操作,因此最好的方法是使用读/写超时(截止日期)来引发您将根据需要处理的错误。
请检查文档http://golang.org/pkg/net/#IPConn.SetReadDeadline中使用的SetReadDeadline/SetWriteDeadline
或本回答中使用的https://stackoverflow.com/a/12741495/93767
修复处理程序部分后,您可以使用客户端计数而不会出现任何问题。