溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Go語(yǔ)言怎么實(shí)現(xiàn)一個(gè)簡(jiǎn)單的并發(fā)聊天室

發(fā)布時(shí)間:2022-03-19 08:58:00 來(lái)源:億速云 閱讀:178 作者:iii 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下Go語(yǔ)言怎么實(shí)現(xiàn)一個(gè)簡(jiǎn)單的并發(fā)聊天室的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

    并發(fā)聊天服務(wù)器

    這里主要是實(shí)現(xiàn)一個(gè)簡(jiǎn)單的并發(fā)聊天服務(wù)器。首先,客戶(hù)端可以在服務(wù)器中注冊(cè)自己的信息(登錄以及退出),客戶(hù)端發(fā)出的所有的信息由服務(wù)器向各個(gè)客戶(hù)端進(jìn)行轉(zhuǎn)發(fā),或者換句話(huà)說(shuō)是廣播。

    具體代碼

    服務(wù)端

    說(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ù)端

    客戶(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è)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(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)容。

    AI