Go实现简易聊天室(群聊)

简介: Go实现简易聊天室(群聊)

 参考:Go 群聊 ( goroutine ) · 语雀

基于websocket的聊天室,可进一步参考:

(1) go实现聊天室(WebSocket方式)

(2) Golang代码搜集-基于websocket+vue.js的简易聊天室

闲着无聊ing~
一直想着能用go整一些好玩的小工具,想着想着突然想到实现一个简易的群聊工具,然后看了上面几个大佬文章,边看边动手实现下...

聊天室的组成

聊天室分为两个部分,分别是:

    • 服务端
    • 客户端

    然后,一般情况下我们互相聊天使用的都只是客户端而已,服务端只是起到调度的作用。

    信息发送与接收的流程

       假设我们有 服务端(S) 客户端(C1) 客户端(C2) 客户端(C3)并且 S 已经 与 C1 C2 C3 建立了连接。

    理论上的流程是这样的:

      1. C1 向 S 发出信息
      2. S 接收到信息
      3. S 将接收到的信息广播给 C2 C3
      4. C2 C3 接收信息

      服务端代码

      packagemainimport (
      "fmt""net""time")
      // 客户端 mapvarclientMap=make(map[string]*net.TCPConn) // 存储当前群聊中所有用户连接信息:key: ip+port, val: 用户连接信息// 监听请求funclistenClient(ipAndPortstring) {
      tcpAddr, _ :=net.ResolveTCPAddr("tcp", ipAndPort)
      tcpListener, _ :=net.ListenTCP("tcp", tcpAddr)
      for { // 循环接收clientConn, _ :=tcpListener.AcceptTCP()                 // 监听请求连接clientMap[clientConn.RemoteAddr().String()] =clientConn// 将连接添加到 mapgoaddReceiver(clientConn)
      fmt.Println("用户 : ", clientConn.RemoteAddr().String(), " 已连接.")
          }
      }
      // 向连接添加接收器funcaddReceiver(newConnect*net.TCPConn) {
      for {
      byteMsg :=make([]byte, 2048)
      len, err :=newConnect.Read(byteMsg) // 从newConnect中读取信息到缓存中iferr!=nil {
      newConnect.Close()
              }
      fmt.Println(string(byteMsg[:len]))
      msgBroadcast(byteMsg[:len], newConnect.RemoteAddr().String())
          }
      }
      // 广播给所有 clientfuncmsgBroadcast(byteMsg []byte, keystring) {
      fork, con :=rangeclientMap {
      ifk!=key { // 转发消息给当前群聊中,除自身以外的其他用户con.Write(byteMsg)
              }
          }
      }
      // 初始化funcinitGroupChatServer() {
      fmt.Println("服务已启动...")
      time.Sleep(1*time.Second)
      fmt.Println("等待客户端请求连接...")
      golistenClient("127.0.0.1:1801")
      select {}
      }
      funcmain() {
      initGroupChatServer()
      }

      image.gif

      客户端代码

      packagemainimport (
      "bufio""fmt""net""os")
      // 用户名varloginNamestring// 本机连接varselfConnect*net.TCPConn// 读取行文本varreader=bufio.NewReader(os.Stdin)
      // 建立连接funcconnect(addrstring) {
      tcpAddr, _ :=net.ResolveTCPAddr("tcp", addr) // 使用tcpcon, err :=net.DialTCP("tcp", nil, tcpAddr)  // 拨号:主动向server建立连接selfConnect=coniferr!=nil {
      fmt.Println("连接服务器失败")
      os.Exit(1)
          }
      gomsgSender()
      gomsgReceiver()
      }
      // 消息接收器funcmsgReceiver() {
      buff :=make([]byte, 2048)
      for {
      len, _ :=selfConnect.Read(buff) // 从建立连接的缓冲区读消息fmt.Println(string(buff[:len]))
          }
      }
      // 消息发送器funcmsgSender() {
      for {
      bMsg, _, _ :=reader.ReadLine()
      bMsg= []byte(loginName+" : "+string(bMsg))
      selfConnect.Write(bMsg) // 发消息    }
      }
      // 初始化funcinitGroupChatClient() {
      fmt.Println("请问您怎么称呼?")
      bName, _, _ :=reader.ReadLine()
      loginName=string(bName)
      connect("127.0.0.1:1801")
      select {}
      }
      funcmain() {
      initGroupChatClient()
      }

      image.gif

      运行结果展示:

      server端:

      image.gif编辑

      client端:

      image.gif编辑


      目录
      相关文章
      |
      移动开发 前端开发 网络协议
      【go,聊天室】认识 WebSocket
      【go,聊天室】认识 WebSocket
      612 0
      【go,聊天室】认识 WebSocket
      |
      Go
      GO------小白之并发聊天室
      因为没有写客户端、可以在cmd中利用  nc -u 来充当客户端 广播用户上线:                       1、主go程中创建socket、defer                       2、循环监听客户端连接请求      ...
      1068 0
      |
      Go 区块链 数据安全/隐私保护
      以太坊系列之十八: 百行go代码构建p2p聊天室
      百行go代码构建p2p聊天室 百行go代码构建p2p聊天室 1. 上手使用 2. whisper 原理 3. 源码解读 3.1 参数说明 3.1 连接主节点 3.2 我的标识 3.2 配置我的节点 3.
      1442 0
      |
      NoSQL 应用服务中间件 Go
      |
      21天前
      |
      存储 Go 索引
      go语言中数组和切片
      go语言中数组和切片
      34 7
      |
      21天前
      |
      Go 开发工具
      百炼-千问模型通过openai接口构建assistant 等 go语言
      由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
      |
      21天前
      |
      程序员 Go
      go语言中结构体(Struct)
      go语言中结构体(Struct)
      94 71
      |
      20天前
      |
      存储 Go 索引
      go语言中的数组(Array)
      go语言中的数组(Array)
      101 67
      |
      23天前
      |
      Go 索引
      go语言for遍历数组或切片
      go语言for遍历数组或切片
      93 62
      |
      1天前
      |
      存储 监控 算法
      员工上网行为监控中的Go语言算法:布隆过滤器的应用
      在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
      26 8
      员工上网行为监控中的Go语言算法:布隆过滤器的应用