用go實現併發聊天室
還是老一套,go在網路模組的開發確實是便捷無比,使用goroutine的特性簡直是如魚得水,準備簡單的使用go做一個cs的聊天室,整體程式碼不到一千行,核心程式碼可能就一兩百行,非常通俗易懂,能幫助我們學習goroutine的特性和感受tcp。
原始碼:https://github.com/lightTrace/go-learn/tree/chatroom
效果圖
服務端:
客戶端jack:
客戶端pony:
一 服務端
server.go
首先主程式埠都是從main開始:
func main() {
if len(os.Args) == 2 {
uData = getAllUser(dataFileName) // 使用者登入、註冊資料初始化
StartServer(os.Args[1]) // 啟動服務端,命令列的第二個引數是埠號
} else {
fmt.Println("輸入錯誤!")
}
}
可以看到啟動服務端有兩步操作:getAllUser獲取使用者和StartServer啟動服務端
獲取使用者就是開啟本地檔案讀取的過程,關鍵是StartServer,StartServer首先createTCP創造一個tcp連線。
然後dataSent啟動伺服器廣播協程:用於廣播客戶端和服務端互動的所有資訊並中轉傳送給相應客戶端,通過“-”分割解析判斷;
intoManager是啟動管理模組,接收輸入的資訊來判斷是管理員註冊還是登入,登入成功後開啟管理員管理模組admimManager
connManager啟動管理協程,一旦connection通道有連線斷開就會通知
然後conn, err := l.Accept()啟動無限迴圈監聽連線,然後分別啟動recv接收資料和sentData傳送資料的協程;
最後開啟userAuth驗證協程,根據flag判斷是註冊還是登入
二 客戶端
client.go
client就更簡單了,建立連線後直接開啟資料接收和傳送協程,由使用者輸入資料判斷進行具體的操作
相關文章
- 用Java 19實現類似Go併發 - mccueJavaGo
- 在Go中如何實現併發Go
- 聊天室應用開發實踐(二):實現基於 Web 的聊天室Web
- go 實現歸併排序Go排序
- Go - 使用 sync.WaitGroup 來實現併發操作GoAI
- Go巢狀併發實現EDM,附坑點分析#1Go巢狀
- 聊天室應用開發實踐(一)
- 用PHP實現高併發伺服器PHP伺服器
- 用多執行緒,實現併發,TCP執行緒TCP
- PHP下用Swoole實現Actor併發模型PHP模型
- go併發 - channelGo
- Go 併發操作Go
- go 併發 mapGo
- Go 併發 -- 通道Go
- Go併發原理Go
- 使用 go-zero 優雅地實現併發編排任務Go
- golang實現併發爬蟲三(用佇列排程器實現)Golang爬蟲佇列
- 原生Node 實現聊天室
- Go高效併發 11 | 併發模式:Go 語言中即學即用的高效併發模式Go模式
- 用node實現一個簡單的聊天室——websocket實踐Web
- Go 高階併發Go
- Go 併發 -- 協程Go
- GO語言併發Go
- Go語言專案實戰:多人聊天室Go
- Go 併發程式設計 - 併發安全(二)Go程式設計
- curl_multi實現併發
- [譯] 思考實踐:用 Go 實現 FlutterGoFlutter
- Websocket 直播間聊天室教程 - GoEasy 快速實現聊天室WebGo
- Go語言專案實戰:併發爬蟲Go爬蟲
- 第09章 Go語言併發,Golang併發Golang
- laravel5.4實現實時聊天室Laravel
- GO-併發技術Go
- Go 併發程式設計Go程式設計
- Go 筆記之併發Go筆記
- 學習 Go併發模型Go模型
- go併發-工作池模式Go模式
- 用 Go 實現一個 LRU cacheGo
- 用 Go + Redis 實現分散式鎖GoRedis分散式