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
      594 0
      【go,聊天室】认识 WebSocket
      |
      Go
      GO------小白之并发聊天室
      因为没有写客户端、可以在cmd中利用  nc -u 来充当客户端 广播用户上线:                       1、主go程中创建socket、defer                       2、循环监听客户端连接请求      ...
      1056 0
      |
      Go 区块链 数据安全/隐私保护
      以太坊系列之十八: 百行go代码构建p2p聊天室
      百行go代码构建p2p聊天室 百行go代码构建p2p聊天室 1. 上手使用 2. whisper 原理 3. 源码解读 3.1 参数说明 3.1 连接主节点 3.2 我的标识 3.2 配置我的节点 3.
      1427 0
      |
      NoSQL 应用服务中间件 Go
      |
      7天前
      |
      Go
      Go 语言循环语句
      在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
      16 1
      |
      6天前
      |
      Go 开发者
      探索Go语言的并发之美
      在Go语言的世界里,"并发"不仅仅是一个特性,它是一种哲学。本文将带你领略Go语言中goroutine和channel的魔力,揭示如何通过Go的并发机制来构建高效、可靠的系统。我们将通过一个简单的示例,展示如何利用Go的并发特性来解决实际问题,让你的程序像Go一样,轻盈而强大。
      |
      7天前
      |
      JSON Go API
      使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
      使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
      |
      7天前
      |
      Go
      go语言创建字典
      go语言创建字典
      |
      8天前
      |
      安全 Go 数据处理
      探索Go语言的并发之美:Goroutines与Channels
      在Go语言的世界里,"并发"不仅仅是一个概念,它是一种生活的方式。本文将带你领略Go语言中Goroutines和Channels的魔力,它们是如何让并发编程变得既简单又高效。我们将通过一个简单的示例,展示如何使用这些工具来构建一个高性能的网络服务。
      |
      8天前
      |
      关系型数据库 Go 数据处理
      高效数据迁移:使用Go语言优化ETL流程
      在本文中,我们将探索Go语言在处理大规模数据迁移任务中的独特优势,以及如何通过Go语言的并发特性来优化数据提取、转换和加载(ETL)流程。不同于其他摘要,本文不仅展示了Go语言在ETL过程中的应用,还提供了实用的代码示例和性能对比分析。
      下一篇
      无影云桌面