温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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