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
      605 0
      【go,聊天室】认识 WebSocket
      |
      Go
      GO------小白之并发聊天室
      因为没有写客户端、可以在cmd中利用  nc -u 来充当客户端 广播用户上线:                       1、主go程中创建socket、defer                       2、循环监听客户端连接请求      ...
      1063 0
      |
      Go 区块链 数据安全/隐私保护
      以太坊系列之十八: 百行go代码构建p2p聊天室
      百行go代码构建p2p聊天室 百行go代码构建p2p聊天室 1. 上手使用 2. whisper 原理 3. 源码解读 3.1 参数说明 3.1 连接主节点 3.2 我的标识 3.2 配置我的节点 3.
      1438 0
      |
      NoSQL 应用服务中间件 Go
      |
      7天前
      |
      存储 JSON 监控
      Viper,一个Go语言配置管理神器!
      Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
      25 2
      |
      5天前
      |
      Go 索引
      go语言中的循环语句
      【11月更文挑战第4天】
      15 2
      |
      5天前
      |
      Go C++
      go语言中的条件语句
      【11月更文挑战第4天】
      18 2
      |
      10天前
      |
      Ubuntu 编译器 Linux
      go语言中SQLite3驱动安装
      【11月更文挑战第2天】
      33 7
      |
      10天前
      |
      关系型数据库 Go 网络安全
      go语言中PostgreSQL驱动安装
      【11月更文挑战第2天】
      41 5
      |
      10天前
      |
      安全 Go
      用 Zap 轻松搞定 Go 语言中的结构化日志
      在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
      28 1