zoukankan      html  css  js  c++  java
  • go聊天室

    package main

    import (
    "fmt"
    "net"
    "sync"
    )

    var mux sync.RWMutex
    var onlineUser = make(map[string]net.Conn)
    var messageChan = make(chan string)

    func main() {
    listen, err := net.Listen("tcp", "127.0.0.1:8888")
    if err != nil {
    fmt.Printf("listen error %s ", err)
    }

    defer listen.Close()

    go listenBroadMessage()

    for {
    conn, err := listen.Accept()
    if err != nil {
    fmt.Printf("conn error %s ", err)
    }

    go handlerConn(conn)

    }
    }

    // listen broad message and send to all user
    func listenBroadMessage() {
    for {
    msg := <-messageChan
    fmt.Println("收到消息:" + msg)
    for _, conn := range onlineUser {
    conn.Write([]byte(msg))
    }
    }
    }

    //broadcast message
    func broadMessage(conn net.Conn, message string) {
    messageChan <- generateMessage(conn, message)
    }


    func generateMessage(conn net.Conn, msg string) string {
    return "[" + conn.RemoteAddr().String() + "]" + " " + msg + " "
    }

    // handler each user
    func handlerConn(conn net.Conn) {
    addr := conn.RemoteAddr().String()
    broadMessage(conn, "进入了房间")

    mux.Lock()
    onlineUser[addr] = conn
    mux.Unlock()

    var isQuit = make(chan bool)
    go func() {
    buff := make([]byte, 4098)
    for {
    n, _ := conn.Read(buff)
    if n == 0 {
    isQuit <- true
    return
    }
    buffMsg := string(buff[:n-1])
    if buffMsg != "" {
    broadMessage(conn, buffMsg)
    }
    }

    }()

    for {
    select {
    case <-isQuit:
    delete(onlineUser, addr)
    broadMessage(conn, "离开了房间")
    return
    }
    }
    }

      

    https://blog.csdn.net/weixin_42940826/article/details/82386275

  • 相关阅读:
    Chrome浏览器与常用插件推荐
    时间戳 转换24小时制
    fis3 开启相对地址
    web手机端禁止滑动,web手机端禁止上下滑动。
    rem的用法
    手机端复制,pc端复制
    ruby 镜像安装
    使用Potree渲染大规模点云-踩坑记录
    移动端真机调试神器-spy-debugger
    手撕Promise.any
  • 原文地址:https://www.cnblogs.com/brady-wang/p/15090119.html
Copyright © 2011-2022 走看看