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

更新於 2024/05/20閱讀時間約 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])
}
}
}








avatar-img
8會員
123內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
小黑與程式的邂逅 的其他內容
package main import ( "bufio" "fmt" "net" "os" "time" ) func main() { //指定協定 tcpAddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8086") if
Gorm是Go當中一款ORM函數褲,有以下特點: 支持連結 支援鉤子函數Hook 支援預先載入 支援交易 支援複合主鍵 支援SQL生成器 支援資料庫自動遷移 支援自訂日誌 可擴充性 所有功能都被測試覆蓋 安裝 go get -u github.com/jinzhu/gor
下載 go get github.com/gomodule/redigo 連接 package main import ( "fmt" "github.com/gomodule/redigo/redis" ) func main() { c, err := redis.Dial(
Redis被稱為「資料結構伺服器」,因為其中的值(Value)可以是字串(String)、雜湊(Hash)、清單(List)、集合(Set)和有序集合(Sorted Set)等類型。 安裝 下載 wget https://download.redis.io/release/redis-6.
下載驅動 go get -u github.com/go-sql-driver/mysql 連接資料庫 package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) var db *
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
package main import ( "bufio" "fmt" "net" "os" "time" ) func main() { //指定協定 tcpAddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8086") if
Gorm是Go當中一款ORM函數褲,有以下特點: 支持連結 支援鉤子函數Hook 支援預先載入 支援交易 支援複合主鍵 支援SQL生成器 支援資料庫自動遷移 支援自訂日誌 可擴充性 所有功能都被測試覆蓋 安裝 go get -u github.com/jinzhu/gor
下載 go get github.com/gomodule/redigo 連接 package main import ( "fmt" "github.com/gomodule/redigo/redis" ) func main() { c, err := redis.Dial(
Redis被稱為「資料結構伺服器」,因為其中的值(Value)可以是字串(String)、雜湊(Hash)、清單(List)、集合(Set)和有序集合(Sorted Set)等類型。 安裝 下載 wget https://download.redis.io/release/redis-6.
下載驅動 go get -u github.com/go-sql-driver/mysql 連接資料庫 package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) var db *
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
新賽季新希望,每隻球隊都有自己的中心思想、歡呼口號、應援歌曲,然而不變的最終目標就是贏得年度總冠軍,在那之前所能做的、就是全力以赴,永不退縮。
原本的計畫是寫系列文,一天嗑一點,雖然完整影片約17小時,分批消化卻花了我近10天,現在回去看我第一天寫的草稿,編輯時間已經是半年前...。
親了,然後呢? 過了一兩分鐘姐姐似乎是回神過來,丟下一句妳先不要下車,接著關上我這邊的車門,回到駕駛座,我內心的OS:完了完了巴比Q了༼⁠⁰⁠o⁠⁰⁠;⁠༽ 「明天早上幾點來接妳?」 我???(⁠ʘ⁠ᗩ⁠ʘ) 「妳的機車不是停在公司那?親了我後就忘了?」 『不麻煩主管了,我可以搭計程車或者我
Thumbnail
今年FGO台服終於預計在年底進入2-7,又常常看到很多人說對中南美洲文化不熟, 因此想再把文章統整成一下成更適合作為遊戲補充資料的版本,希望大家在到時遊玩2-7時有更多樂趣。 第一篇基本上是以基礎知識為主,不太會有遊戲劇透。
Thumbnail
之前已經與大家談過讓我第一次挑戰就成功設計出有趣桌遊教具的「GO START」專案管理心法當中的 G、O、S,現在就來繼續分享 T、A、R、T。請容我再次強調,這是人人都適用的專案管理心法,上下兩篇一起看完後,你就會發現要掌握專案管理的要點沒有想像中那麼困難。
Thumbnail
與大家分享我第一次挑戰就成功設計出有趣桌遊教具的「GO START」專案管理心法。這篇先介紹心法當中的 G、O、S,下一篇會繼續分享 T、A、R、T。這是人人都適用的專案管理心法,上下兩篇一起看完後,你就會發現要掌握專案管理的要點沒有想像中那麼困難。
喝著shot,苦辣嗆辣令眼淚噴出變得很合理,乾杯這苦悶的日子。 她豪邁的大腿一開坐著喝shot,崇拜過像霹靂嬌娃那樣來個霹靂腿一掃的快感。 這裡不是皇后區,只有跟她從來不熟的算數公式與做人的外星球,又是苦悶的一天過去,她懷念著跳著舞的快樂就那樣子一直跳!跳!跳!哈哈哈的過了每一天的有她存在的意義
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
新賽季新希望,每隻球隊都有自己的中心思想、歡呼口號、應援歌曲,然而不變的最終目標就是贏得年度總冠軍,在那之前所能做的、就是全力以赴,永不退縮。
原本的計畫是寫系列文,一天嗑一點,雖然完整影片約17小時,分批消化卻花了我近10天,現在回去看我第一天寫的草稿,編輯時間已經是半年前...。
親了,然後呢? 過了一兩分鐘姐姐似乎是回神過來,丟下一句妳先不要下車,接著關上我這邊的車門,回到駕駛座,我內心的OS:完了完了巴比Q了༼⁠⁰⁠o⁠⁰⁠;⁠༽ 「明天早上幾點來接妳?」 我???(⁠ʘ⁠ᗩ⁠ʘ) 「妳的機車不是停在公司那?親了我後就忘了?」 『不麻煩主管了,我可以搭計程車或者我
Thumbnail
今年FGO台服終於預計在年底進入2-7,又常常看到很多人說對中南美洲文化不熟, 因此想再把文章統整成一下成更適合作為遊戲補充資料的版本,希望大家在到時遊玩2-7時有更多樂趣。 第一篇基本上是以基礎知識為主,不太會有遊戲劇透。
Thumbnail
之前已經與大家談過讓我第一次挑戰就成功設計出有趣桌遊教具的「GO START」專案管理心法當中的 G、O、S,現在就來繼續分享 T、A、R、T。請容我再次強調,這是人人都適用的專案管理心法,上下兩篇一起看完後,你就會發現要掌握專案管理的要點沒有想像中那麼困難。
Thumbnail
與大家分享我第一次挑戰就成功設計出有趣桌遊教具的「GO START」專案管理心法。這篇先介紹心法當中的 G、O、S,下一篇會繼續分享 T、A、R、T。這是人人都適用的專案管理心法,上下兩篇一起看完後,你就會發現要掌握專案管理的要點沒有想像中那麼困難。
喝著shot,苦辣嗆辣令眼淚噴出變得很合理,乾杯這苦悶的日子。 她豪邁的大腿一開坐著喝shot,崇拜過像霹靂嬌娃那樣來個霹靂腿一掃的快感。 這裡不是皇后區,只有跟她從來不熟的算數公式與做人的外星球,又是苦悶的一天過去,她懷念著跳著舞的快樂就那樣子一直跳!跳!跳!哈哈哈的過了每一天的有她存在的意義