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!")
        }
    }

    原创文章,作者:ECYTN,如若转载,请注明出处:https://www.beidanyezhu.com/a/29573.html

    (0)
    ECYTN的头像ECYTN
    上一篇 2025-02-09
    下一篇 2025-02-09

    相关推荐

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注

    分享本页
    返回顶部