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

  • 相关阅读:
    [leetcode]Set Matrix Zeroes
    [leetcode]Sort Colors
    [leetcode]Combinations
    [leetcode]Subsets
    [leetcode]Search a 2D Matrix
    [leetcode]Best Time to Buy and Sell Stock III
    [leetcode]Best Time to Buy and Sell Stock II
    [leetcode]Best Time to Buy and Sell Stock
    半平面交 (poj 1279(第一道半平面NlogN)完整注释 )
    hdu 4277 USACO ORZ (Dfs)
  • 原文地址:https://www.cnblogs.com/brady-wang/p/15090119.html
Copyright © 2011-2022 走看看