日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang完成聊天室功能

發布時間:2024/4/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang完成聊天室功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

go語言易于實現高并發,簡易聊天室如下:

package mainimport ("fmt""net" )/* 主go程:創建監聽socket,for循環accept獲取到客戶端的conn,開啟goroutine HandlerConnect HandlerConnect:創建用戶結構體,存入onlineMap,發送用戶登錄廣播 Manager:監聽全局的channel message,將讀到的消息廣播給onlineMap中的所有用戶 WriteMsgToClient:讀取每個用戶自帶channel C上消息,回寫給用戶 */ // 創建用戶結構體類型 type Client struct {C chan stringName stringAddr string }// 創建全局map,將用戶存儲到這里 var onlineMap map[string]Client// 創建全局channel穿遞用戶消息 var message = make(chan string)func WriteMsgToClient(clnt Client, conn net.Conn) {// 監聽用戶自帶Channel上是否有消息for msg := range clnt.C {conn.Write([]byte(msg + "\n"))} }func Manager() {// 初始化map,onlineMaponlineMap = make(map[string]Client)for { // 循環從message中讀取是否有數據// 監聽channel中是否有數據,有數據存儲至message,無數據就阻塞msg := <-message// 循環發送消息給所有在線用戶for _, clnt := range onlineMap {clnt.C <- msg}}}func MakeMsg(clnt Client, msg string) (buf string) {buf = "[" + clnt.Addr + "]" + clnt.Name + ":" + msgreturn }func HandlerConnect(conn net.Conn) {defer conn.Close()// 獲取用戶網絡地址netAddr := conn.RemoteAddr().String()// 創建新連接用戶的結構體clnt := Client{make(chan string), netAddr, netAddr}// 將新連接用戶添加到在線用戶map中,key:IP+port value:clientonlineMap[netAddr] = clnt// 創建專門用來給當前用戶發送消息的goroutinego WriteMsgToClient(clnt, conn)// 發送用戶上線消息到全局通道中//message <- "[" + netAddr + "]" + clnt.Name + "login"message <- MakeMsg(clnt, "login")// 創建一個匿名goroutine,專門處理用戶發送的消息go func() {buf := make([]byte, 4096)for {n, err := conn.Read(buf)if n == 0 {fmt.Printf("檢測到客戶端%s退出\n", clnt.Name)return}if err != nil {fmt.Println("conn Read err", err)return}// 將讀到的用戶消息保存到msg中,string類型msg := string(buf[:n])// 將讀到的用戶消息廣播給所用在線用戶(寫入到message中)message <- MakeMsg(clnt, msg)}}()// 保證不退出for {} }func main() {// 創建監聽套接字listener, err := net.Listen("tcp", "127.0.0.1:9001")if err != nil {fmt.Println("Listen err", err)return}defer listener.Close()// 創建管理者go程go Manager()// 循環監聽客戶端請求for {conn, err := listener.Accept()if err != nil {fmt.Println("accept err", err)return}go HandlerConnect(conn)} } 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的golang完成聊天室功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。