使用Golang怎么實現并發聊天室?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
在湘鄉等地區,都構建了全面的區域性戰略布局,加強發展的系統性、市場前瞻性、產品創新能力,以專注、極致的服務理念,為客戶提供做網站、成都網站制作 網站設計制作按需定制開發,公司網站建設,企業網站建設,品牌網站制作,營銷型網站建設,外貿網站建設,湘鄉網站建設費用合理。
package main import ( "net" "fmt" "strings" "time" ) //定義的此結構體為全局map的value值,包括每一個用戶的姓名,ip地址和私人管道 type client struct { name string addr string C chan string } /*這個函數是將私人管道中的內容發送給用戶,配合全局管道Message使用可以實現廣播的功能, 單獨使用可以實現私聊的功能*/ func writemsg2client(clinet client,conn net.Conn) { for m := range clinet.C { conn.Write([]byte(m + "\n")) } } //這只是一個封裝好用來統一(發送信息格式)的小函數,不用在意 func makemsg(name string, addr string, s string) string { return "[" + addr + "]" + name + s } //每一個進入聊天室的用戶都將啟動一個handleconn的go程來處理事件 func handleconn(conn net.Conn) { defer conn.Close() /*用戶連接進來以后要初始化全局map,把自己的信息加入到字典里,相當于進到聊天室里之前要登 記一下個人信息,注意姓名初始為ip地址。*/ addr := conn.RemoteAddr().String() fmt.Printf("用戶%s進入了房間\n", addr) client := client{addr, addr, make(chan string)} //在這里啟動子go程,功能上面已經提及 go writemsg2client(client,conn) onlinemap[addr] = client //登錄進來一切準備就緒后就給所有人廣播上線信息啦 Message <- makemsg(client.name, addr, "login") //下面這三個變量服務于下面一些小功能 var haschat=make(chan bool) var ifquit=make(chan bool) var flag bool //從這單獨開啟一個go程來讀取用戶輸入的信息 go func() { buf:=make([]byte,4096) for { n,_:=conn.Read(buf) if n==0 { fmt.Printf("%s離開了房間\n",client.name) ifquit<-true return } //改名功能的實現 if string(buf[:7])=="Rename|" { client.name=strings.Split(string(buf[:n-1]),"|")[1] onlinemap[addr]=client conn.Write([]byte("rename success\n")) }else if string(buf[:n-1])=="/who"{ //查詢在線用戶信息的功能 for _,s:=range onlinemap{ conn.Write([]byte(s.name+"online\n")) } }else if string(buf[:2])=="m|"&&strings.Count(string(buf[:n]),"|")==2 { /*私聊功能的實現,其實私聊功能就是跳過了往全局Message里傳輸信息, 改為直接向私人管道里傳輸信息*/ flag=false slice:=strings.Split(string(buf[:n-1]),"|") for _,a:=range onlinemap{ //遍歷所有在線用戶,向指定的用戶管道中發送信息 if a.name==slice[1]{ flag=true a.C<-makemsg(client.name,addr,slice[2]) conn.Write([]byte("send success")) } } if flag { conn.Write([]byte("no such man or not online")) } } else { Message<-makemsg(client.name,addr,string(buf[:n-1])) } haschat<-true } }() for { select { case <-haschat: //超時強踢 case <-time.After(time.Minute*3): delete(onlinemap,addr) Message<-makemsg(client.name,addr,"out time to leave") close(client.C) return case <-ifquit: //退出處理 delete(onlinemap,addr) Message<-makemsg(client.name,addr,"out time to leave") close(client.C) return } } } //這個函數用來將全局Message中的內容全部塞到私人管道C里,實現上下線廣播和群聊的功能 func Manager() { for { msg := <-Message for _, s := range onlinemap { s.C <- msg } } } var Message = make(chan string) var onlinemap map[string]client = make(map[string]client) //主函數 func main() { listener, _ := net.Listen("tcp", "127.0.0.1:6666") defer listener.Close() //提前開啟全局Message的go程,防止被阻塞 go Manager() for { conn, err := listener.Accept() if err != nil { fmt.Println("accept err", err) continue } //每一個連接進來的用戶都會被分配進入一個子go程,用來處理上面我們提到的各種功能 go handleconn(conn) } }
關于使用Golang怎么實現并發聊天室問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創新互聯行業資訊頻道了解更多相關知識。
名稱欄目:使用Golang怎么實現并發聊天室
URL網址:http://vcdvsql.cn/article46/pesieg.html
成都網站建設公司_創新互聯,為您提供手機網站建設、關鍵詞優化、搜索引擎優化、網頁設計公司、軟件開發、云服務器
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯