golang完成聊天室功能
生活随笔
收集整理的這篇文章主要介紹了
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完成聊天室功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang基于UDP完成
- 下一篇: 用go语言完成爬虫