[Go][Socket]聊天室(Server)

小黑
發佈於後端
2024/01/08閱讀時間約 3 分鐘
package main

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

var ConnSlice map[net.Conn]*Heartbeat

type Heartbeat struct {
endTime int64 //結束時間
}

func main() {
//建立連線
ConnSlice = map[net.Conn]*Heartbeat{}
l, err := net.Listen("tcp", "127.0.0.1:8086")

if err != nil {
fmt.Println("連線失敗")
}

defer l.Close()

for {
conn, err := l.Accept()

if err != nil {
fmt.Println("Error accepting: ", err)
}
fmt.Printf("Received message %s -> %s \n", conn.RemoteAddr(), conn.LocalAddr())

ConnSlice[conn] = &Heartbeat{
endTime: time.Now().Add(time.Second * 5).Unix(), //初始化結束時間
}

go handelConn(conn)
}
}

func handelConn(c net.Conn) {
buffer := make([]byte, 1024)

for {
n, err := c.Read(buffer)

if ConnSlice[c].endTime > time.Now().Unix() {
ConnSlice[c].endTime = time.Now().Add(time.Second * 5).Unix() //更新心跳時間
} else {
fmt.Println("長時間未發訊息斷開連接")
return
}

if err != nil {
return
}

//是心跳檢查,就不繼續執行
if string(buffer[0:n]) == "1" {
c.Write([]byte("1"))
continue
}

for conn, heart := range ConnSlice {
if conn == c {
continue
}

//心跳檢查,需要傳送資料的時候才檢查規定時間內有沒有資料
if heart.endTime < time.Now().Unix() {
delete(ConnSlice, conn) //刪除連線
conn.Close()
fmt.Println("刪除連接", conn.RemoteAddr())
fmt.Println("現在存有連結", ConnSlice)
continue
}
conn.Write(buffer[0:n])
}
}
}








7會員
78內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
發表第一個留言支持創作者!
從 Google News 追蹤更多 vocus 的最新精選內容