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

  • 相关阅读:
    [抄书]The Pipes and Filters pattern
    [抄书]The Layers pattern
    OpenGL Step by Step (1)
    [HOOPS]二维点向三维空间投影
    心仪已久的工具:BoundsChecker v7.2
    [HOOPS]用HC_Show_...获取正确的点的坐标位置
    小试zlib
    XML (2) Document Type Definitions (DTD)
    UML (1) 设计模式及作业附图
    XML (1) 什么是XML
  • 原文地址:https://www.cnblogs.com/brady-wang/p/15090119.html
Copyright © 2011-2022 走看看