91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言怎么實現一個簡單的并發聊天室

發布時間:2022-03-19 08:58:00 來源:億速云 閱讀:183 作者:iii 欄目:開發技術

今天小編給大家分享一下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語言怎么實現一個簡單的并發聊天室”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    克山县| 阜康市| 清新县| 乌苏市| 滦南县| 杭州市| 大名县| 奉贤区| 盐城市| 壶关县| 马边| 高唐县| 肇东市| 保定市| 正定县| 岳池县| 扬中市| 积石山| 伊宁县| 上高县| 河间市| 丹寨县| 皮山县| 唐海县| 安阳市| 尖扎县| 金平| 梨树县| 海阳市| 邛崃市| 重庆市| 奎屯市| 威宁| 桂平市| 南岸区| 寻乌县| 广昌县| 阜平县| 伊宁县| 义乌市| 正安县|