Go語(yǔ)言通過(guò)TCP協(xié)議實(shí)現(xiàn)聊天室功能
1、服務(wù)端
package main import ( "fmt" "net" "sync" ) type ChatServer struct { clients map[string]net.Conn clientsMux sync.Mutex } func NewChatServer() *ChatServer { return &ChatServer{ clients: make(map[string]net.Conn), } } func (s *ChatServer) broadcast(message string, sender string) { s.clientsMux.Lock() defer s.clientsMux.Unlock() for clientAddr, conn := range s.clients { if clientAddr != sender { fmt.Fprintf(conn, "[%s]: %s\n", sender, message) } } } func (s *ChatServer) handleConnection(conn net.Conn) { defer conn.Close() clientAddr := conn.RemoteAddr().String() fmt.Printf("New connection from %s\n", clientAddr) s.clientsMux.Lock() s.clients[clientAddr] = conn s.clientsMux.Unlock() for { buffer := make([]byte, 1024) n, err := conn.Read(buffer) if err != nil { fmt.Printf("Error reading from %s: %v\n", clientAddr, err) break } message := string(buffer[:n]) fmt.Printf("[%s]: %s\n", clientAddr, message) s.broadcast(message, clientAddr) } } func main() { server := NewChatServer() listener, err := net.Listen("tcp", ":8080") if err != nil { fmt.Println("Error:", err) return } defer listener.Close() fmt.Println("TCP chat server listening on :8080") for { conn, err := listener.Accept() if err != nil { fmt.Println("Error accepting connection:", err) continue } go server.handleConnection(conn) } }
2、客戶(hù)端
package main import ( "bufio" "fmt" "net" "os" ) func readMessages(conn net.Conn) { reader := bufio.NewReader(conn) for { message, err := reader.ReadString('\n') if err != nil { fmt.Println("Error reading message:", err) break } fmt.Print(message) } } func main() { conn, err := net.Dial("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("Error connecting to server:", err) return } defer conn.Close() go readMessages(conn) for { scanner := bufio.NewScanner(os.Stdin) scanner.Scan() message := scanner.Text() _, err := conn.Write([]byte(message + "\n")) if err != nil { fmt.Println("Error sending message:", err) break } } }
3、實(shí)現(xiàn)效果
到此這篇關(guān)于Go語(yǔ)言通過(guò)TCP協(xié)議實(shí)現(xiàn)聊天室功能的文章就介紹到這了,更多相關(guān)Go TCP實(shí)現(xiàn)聊天室內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室
- Go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的并發(fā)聊天室的項(xiàng)目實(shí)戰(zhàn)
- golang實(shí)現(xiàn)簡(jiǎn)單的tcp數(shù)據(jù)傳輸
- Go語(yǔ)言如何實(shí)現(xiàn)TCP通信詳解
- GO語(yǔ)言實(shí)現(xiàn)TCP服務(wù)器的示例代碼
- Golang使用gin框架實(shí)現(xiàn)一個(gè)完整的聊天室功能
- Go實(shí)現(xiàn)跨平臺(tái)的藍(lán)牙聊天室示例詳解
- Go構(gòu)建WiFi局域網(wǎng)聊天室示例詳解
相關(guān)文章
golang中連接mysql數(shù)據(jù)庫(kù)
這篇文章主要介紹了golang中連接mysql數(shù)據(jù)庫(kù)的步驟,幫助大家更好的理解和學(xué)習(xí)go語(yǔ)言,感興趣的朋友可以了解下2020-12-12Golang標(biāo)準(zhǔn)庫(kù)time包日常用法小結(jié)
本文主要介紹了Golang標(biāo)準(zhǔn)庫(kù)time包日常用法小結(jié),可以通過(guò)它們來(lái)獲取當(dāng)前時(shí)間、創(chuàng)建指定時(shí)間、解析時(shí)間字符串、控制時(shí)間間隔等操作,感興趣的可以了解一下2023-11-11使用Golang實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)數(shù)據(jù)包的捕獲與分析
在網(wǎng)絡(luò)通信中,網(wǎng)絡(luò)數(shù)據(jù)包是信息傳遞的基本單位,抓包是一種監(jiān)控和分析網(wǎng)絡(luò)流量的方法,用于獲取網(wǎng)絡(luò)數(shù)據(jù)包并對(duì)其進(jìn)行分析,本文將介紹如何使用Golang實(shí)現(xiàn)抓包功能,包括網(wǎng)絡(luò)數(shù)據(jù)包捕獲和數(shù)據(jù)包分析,需要的朋友可以參考下2023-11-11詳解Golang中創(chuàng)建error的方式總結(jié)與應(yīng)用場(chǎng)景
Golang中創(chuàng)建error的方式包括errors.New、fmt.Errorf、自定義實(shí)現(xiàn)了error接口的類(lèi)型等,本文主要為大家介紹了這些方式的具體應(yīng)用場(chǎng)景,需要的可以參考一下2023-07-07深入淺出Go:掌握基礎(chǔ)知識(shí)的關(guān)鍵要點(diǎn)
Go是一種開(kāi)源的編程語(yǔ)言,由Google開(kāi)發(fā),它具有簡(jiǎn)潔、高效、并發(fā)性強(qiáng)的特點(diǎn),適用于構(gòu)建可靠的、高性能的軟件系統(tǒng),本文將介紹Go的基礎(chǔ)知識(shí),需要的朋友可以參考下2023-10-10一文帶你了解Go語(yǔ)言中的指針和結(jié)構(gòu)體
前面的兩篇文章對(duì)?Go?語(yǔ)言的基礎(chǔ)語(yǔ)法和基本數(shù)據(jù)類(lèi)型以及幾個(gè)復(fù)合數(shù)據(jù)類(lèi)型進(jìn)行介紹,本文將對(duì)?Go?里面的指針和結(jié)構(gòu)體進(jìn)行介紹,也為后續(xù)文章做鋪墊,感興趣的可以了解一下2022-11-11