您好,登錄后才能下訂單哦!
今天小編給大家分享一下Go語言怎么實現一個簡單的并發聊天室的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
這里主要是實現一個簡單的并發聊天服務器。首先,客戶端可以在服務器中注冊自己的信息(登錄以及退出),客戶端發出的所有的信息由服務器向各個客戶端進行轉發,或者換句話說是廣播。
說的再多,沒有代碼簡單明了,直接上代碼~
package main import ( "bufio" "fmt" "log" "net" ) type client chan <- string //定義一個單向的向外發送數據的通道 var ( entering = make(chan client) leaving = make(chan client) messages = make(chan string) ) func main() { listener, err := net.Listen("tcp","localhost:8000") if err != nil { log.Fatal("network is broken", err) } go broadcaster() for { conn, err := listener.Accept() if err != nil { log.Print(err) continue } go handleConn1(conn) } } func broadcaster() { clients := make(map[client]bool) //存儲每個client的登錄狀態 for{ select { case msg := <-messages: for cli := range clients { cli <- msg } case cli := <-entering: clients[cli] = true case cli := <-leaving: delete(clients,cli) close(cli) } } } func handleConn1(conn net.Conn) { ch := make(chan string) go clientWriter(conn, ch) who := conn.RemoteAddr().String() ch <- "You are " + who entering <- ch messages <- who + "has arrived" input := bufio.NewScanner(conn) for input.Scan() { messages <- who + ":" + input.Text() } leaving <- ch messages <- who + "has left" conn.Close() } func clientWriter(conn net.Conn, ch <- chan string) { for msg := range ch { fmt.Fprintln(conn, msg) } }
客戶端相對簡單,只是涉及到信息的發送和接受工作。
package main import ( "io" "log" "net" "os" ) func main() { conn, err := net.Dial("tcp","localhost:8000") if err != nil { log.Fatal("Connected has been refused!",err) } defer conn.Close() go mesCopy(os.Stdout,conn) mesCopy(conn,os.Stdin) } func mesCopy(des io.Writer, res io.Reader) { if _, err := io.Copy(des, res); err != nil { log.Print("wrong!") } }
以上就是“Go語言怎么實現一個簡單的并發聊天室”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。