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
      588 0
      【go,聊天室】认识 WebSocket
      |
      Go
      GO------小白之并发聊天室
      因为没有写客户端、可以在cmd中利用  nc -u 来充当客户端 广播用户上线:                       1、主go程中创建socket、defer                       2、循环监听客户端连接请求      ...
      1050 0
      |
      Go 区块链 数据安全/隐私保护
      以太坊系列之十八: 百行go代码构建p2p聊天室
      百行go代码构建p2p聊天室 百行go代码构建p2p聊天室 1. 上手使用 2. whisper 原理 3. 源码解读 3.1 参数说明 3.1 连接主节点 3.2 我的标识 3.2 配置我的节点 3.
      1423 0
      |
      NoSQL 应用服务中间件 Go
      |
      1天前
      |
      安全 大数据 Go
      深入探索Go语言并发编程:Goroutines与Channels的实战应用
      在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
      |
      4天前
      |
      Go
      golang语言之go常用命令
      这篇文章列出了常用的Go语言命令,如`go run`、`go install`、`go build`、`go help`、`go get`、`go mod`、`go test`、`go tool`、`go vet`、`go fmt`、`go doc`、`go version`和`go env`,以及它们的基本用法和功能。
      14 6
      |
      4天前
      |
      存储 Go
      Golang语言基于go module方式管理包(package)
      这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
      10 3
      |
      6天前
      |
      缓存 安全 Java
      如何利用Go语言提升微服务架构的性能
      在当今的软件开发中,微服务架构逐渐成为主流选择,它通过将应用程序拆分为多个小服务来提升灵活性和可维护性。然而,如何确保这些微服务高效且稳定地运行是一个关键问题。Go语言,以其高效的并发处理能力和简洁的语法,成为解决这一问题的理想工具。本文将探讨如何通过Go语言优化微服务架构的性能,包括高效的并发编程、内存管理技巧以及如何利用Go生态系统中的工具来提升服务的响应速度和资源利用率。
      |
      6天前
      |
      Rust Linux Go
      Rust/Go语言学习
      Rust/Go语言学习
      |
      7天前
      |
      Java 数据库连接 数据库
      携手前行:在Java世界中深入挖掘Hibernate与JPA的协同效应
      【8月更文挑战第31天】Java持久化API(JPA)是一种Java规范,为数据库数据持久化提供对象关系映射(ORM)方法。JPA定义了实体类与数据库表的映射及数据查询和事务控制方式,确保不同实现间的兼容性。Hibernate是JPA规范的一种实现,提供了二级缓存、延迟加载等丰富特性,提升应用性能和可维护性。通过结合JPA和Hibernate,开发者能编写符合规范且具有高度可移植性的代码,并利用Hibernate的额外功能优化数据持久化操作。
      21 0
      下一篇
      DDNS