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
      695 0
      【go,聊天室】认识 WebSocket
      |
      Go
      GO------小白之并发聊天室
      因为没有写客户端、可以在cmd中利用  nc -u 来充当客户端 广播用户上线:                       1、主go程中创建socket、defer                       2、循环监听客户端连接请求      ...
      1174 0
      |
      Go 区块链 数据安全/隐私保护
      以太坊系列之十八: 百行go代码构建p2p聊天室
      百行go代码构建p2p聊天室 百行go代码构建p2p聊天室 1. 上手使用 2. whisper 原理 3. 源码解读 3.1 参数说明 3.1 连接主节点 3.2 我的标识 3.2 配置我的节点 3.
      1547 0
      |
      NoSQL 应用服务中间件 Go
      |
      1月前
      |
      存储 安全 Java
      【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
      结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
      144 1
      |
      3月前
      |
      Cloud Native 安全 Java
      Go:为云原生而生的高效语言
      Go:为云原生而生的高效语言
      281 1
      |
      9月前
      |
      运维 监控 算法
      监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
      在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
      |
      3月前
      |
      Cloud Native Go API
      Go:为云原生而生的高效语言
      Go:为云原生而生的高效语言
      358 0
      |
      3月前
      |
      Cloud Native Java Go
      Go:为云原生而生的高效语言
      Go:为云原生而生的高效语言
      229 0
      |
      3月前
      |
      Cloud Native Java 中间件
      Go:为云原生而生的高效语言
      Go:为云原生而生的高效语言
      210 0