下面是一个基于github.com/kataras/iris/websocket
库封装的WebSocket客户端通信对象,并增加了心跳机制的示例代码:
package main
import (
"fmt"
"log"
"time"
"github.com/gorilla/websocket"
)
type WebSocketClient struct {
conn *websocket.Conn
isConnected bool
}
func NewWebSocketClient(url string) (*WebSocketClient, error) {
conn, _, err := websocket.DefaultDialer.Dial(url, nil)
if err != nil {
return nil, err
}
client := &WebSocketClient{
conn: conn,
isConnected: true,
}
return client, nil
}
func (c *WebSocketClient) StartHeartbeat(interval time.Duration) {
go func() {
ticker := time.NewTicker(interval)
defer ticker.Stop()
for range ticker.C {
if !c.isConnected {
break
}
err := c.SendMessage("heartbeat")
if err != nil {
log.Println("Error sending heartbeat:", err)
break
}
fmt.Println("Sent heartbeat")
}
// 处理断开连接后的逻辑,比如重新连接等操作
log.Println("Connection closed. Trying to reconnect...")
// 重新连接代码...
}()
}
func (c *WebSocketClient) SendMessage(message string) error {
err := c.conn.WriteMessage(websocket.TextMessage, []byte(message))
if err != nil {
c.isConnected = false
return err
}
return nil
}
func (c *WebSocketClient) ReceiveMessage() (string, error) {
_, messageBytes, err := c.conn.ReadMessage()
if err != nil {
c.isConnected = false
return "", err
}
message := string(messageBytes)
return message, nil
}
func (c *WebSocketClient) Close() error {
c.isConnected = false
err := c.conn.Close()
if err != nil {
return err
}
return nil
}
func main() {
client, err := NewWebSocketClient("ws://localhost:8080/ws")
if err != nil {
log.Fatal(err)
}
client.StartHeartbeat(10 * time.Second)
go func() {
for client.isConnected {
message, err := client.ReceiveMessage()
if err != nil {
log.Println("Error receiving message:", err)
break
}
fmt.Println("Received message:", message)
}
}()
time.Sleep(time.Second)
err = client.SendMessage("Hello Server!")
if err != nil {
log.Fatal(err)
}
time.Sleep(5 * time.Second)
err = client.Close()
if err != nil {
log.Fatal(err)
}
}
在这个示例代码中,我们通过StartHeartbeat
方法启动了一个心跳机制,定期发送心跳消息给服务器。如果发送消息失败或者接收消息失败,将设置isConnected
标志为false,并退出心跳循环。
注意,在处理断开连接后的逻辑时,可以考虑重新连接服务器等操作。
请根据自己的实际情况进行相应的修改和扩展。
内容由零声教学AI助手提供,问题来源于学员提问