go 实现 tcp服务器检测客户端是否发送心跳包或在5秒内没有请求,那么关闭客户端

发布时间:2023年12月22日

gpt:

在Go语言中,你可以使用`net`包来实现TCP服务器,同时使用`time`包来进行定时操作。以下是一个简单的例子,演示如何实现一个TCP服务器,检测客户端是否发送心跳包,如果在5秒内没有请求,则关闭客户端连接。

```go
package main

import (
?? ?"fmt"
?? ?"net"
?? ?"time"
)

func handleConnection(conn net.Conn) {
?? ?defer conn.Close()

?? ?fmt.Println("Client connected:", conn.RemoteAddr())

?? ?// 设置一个定时器,如果5秒内没有收到客户端的请求,关闭连接
?? ?timer := time.NewTimer(5 * time.Second)
?? ?defer timer.Stop()

?? ?for {
?? ??? ?select {
?? ??? ?case <-timer.C:
?? ??? ??? ?fmt.Println("Timeout. Closing connection.")
?? ??? ??? ?return
?? ??? ?default:
?? ??? ??? ?// 设置读取超时时间为1秒,以便在定时器到期后有机会处理
?? ??? ??? ?conn.SetReadDeadline(time.Now().Add(1 * time.Second))

?? ??? ??? ?// 尝试从客户端读取数据
?? ??? ??? ?buffer := make([]byte, 1024)
?? ??? ??? ?n, err := conn.Read(buffer)
?? ??? ??? ?if err != nil {
?? ??? ??? ??? ?fmt.Println("Error reading:", err)
?? ??? ??? ??? ?return
?? ??? ??? ?}

?? ??? ??? ?if n > 0 {
?? ??? ??? ??? ?// 收到数据,重置定时器
?? ??? ??? ??? ?timer.Reset(5 * time.Second)
?? ??? ??? ??? ?fmt.Printf("Received data from client: %s\n", buffer[:n])
?? ??? ??? ?}
?? ??? ?}
?? ?}
}

func main() {
?? ?listener, err := net.Listen("tcp", ":8080")
?? ?if err != nil {
?? ??? ?fmt.Println("Error listening:", err)
?? ??? ?return
?? ?}
?? ?defer listener.Close()

?? ?fmt.Println("Server listening on :8080")

?? ?for {
?? ??? ?conn, err := listener.Accept()
?? ??? ?if err != nil {
?? ??? ??? ?fmt.Println("Error accepting connection:", err)
?? ??? ??? ?continue
?? ??? ?}

?? ??? ?go handleConnection(conn)
?? ?}
}
```

这个例子中,服务器会接受客户端连接,并为每个连接启动一个新的goroutine(通过`go handleConnection(conn)`)。在`handleConnection`函数中,我们使用一个定时器(`timer`)来检测是否在5秒内没有收到客户端的请求。如果在超时时间内没有数据到达,那么连接将被关闭。

请注意,这只是一个简单的例子,实际应用中可能需要更复杂的心跳包协议和更健壮的错误处理。

文章来源:https://blog.csdn.net/glc22/article/details/135147163
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。