您好,登錄后才能下訂單哦!
今天小編給大家分享一下Go語(yǔ)言怎么實(shí)現(xiàn)一個(gè)簡(jiǎn)單的并發(fā)聊天室的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
這里主要是實(shí)現(xiàn)一個(gè)簡(jiǎn)單的并發(fā)聊天服務(wù)器。首先,客戶(hù)端可以在服務(wù)器中注冊(cè)自己的信息(登錄以及退出),客戶(hù)端發(fā)出的所有的信息由服務(wù)器向各個(gè)客戶(hù)端進(jìn)行轉(zhuǎn)發(fā),或者換句話(huà)說(shuō)是廣播。
說(shuō)的再多,沒(méi)有代碼簡(jiǎn)單明了,直接上代碼~
package main import ( "bufio" "fmt" "log" "net" ) type client chan <- string //定義一個(gè)單向的向外發(fā)送數(shù)據(jù)的通道 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) //存儲(chǔ)每個(gè)client的登錄狀態(tài) 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) } }
客戶(hù)端相對(duì)簡(jiǎn)單,只是涉及到信息的發(fā)送和接受工作。
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語(yǔ)言怎么實(shí)現(xiàn)一個(gè)簡(jiǎn)單的并發(fā)聊天室”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。