参考: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 接收信息

服务端代码

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

客户端代码

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

运行结果展示:

server端:

client端:

Go实现简易聊天室(群聊)相关推荐

  1. java仿QQ聊天室群聊(快速写一个简易QQ)

    [mie haha的博客]转载请注明出处(万分感谢!): https://blog.csdn.net/qq_40315080/article/details/83052689 用java写聊天室实现群 ...

  2. Netty中实现多客户端连接与通信-以实现聊天室群聊功能为例(附代码下载)

    场景 Netty的Socket编程详解-搭建服务端与客户端并进行数据传输: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1086 ...

  3. Java WebSocket实现网络聊天室(群聊+私聊)

    WebChat聊天室 2018.02.26 源码地址早就贴了呀, 留邮箱不如自己下载 项目地址: https://github.com/Amayadream/WebChat 2017.01.11更新 ...

  4. java仿qq群聊_[转载]仿QQ聊天室群聊的练习心得

    javase的学习即将告一段落,作为最后的一个项目练习,仿聊天室的程序编写让我很是头疼了一阵子.说起来还是自己java基础不牢的缘故导致的,虽然整体框架都已经很清晰了但是实际编写过程中却依然磕磕绊绊, ...

  5. springboot和netty整合的聊天室--群聊

    一.创建项目 file-new-project-spring initializr-next 然后 添加这两个依赖 二.代码 DemoApplication package com.example.d ...

  6. 当年的聊天室,今天的我(java实现聊天室群聊功能)

    预备小知识连接: 小小聊天室,慢慢的回忆啊!(TCP 通信实现) 先看效果 主要可以分为三个层:服务端层,客户端层,还有就是工具层: 服务断层:包括接收数据,以及转发数据(数据输出输入流): 客户端层 ...

  7. PHP+AJAX高性能聊天室(群聊+私聊)

    无需服务端 Anlin_chat 一个多功能免费开源的网页聊天室,基于php+mysql+js运行 无需服务端,高效+极快的运行速度 (超高安全性)支持分类帖子推送兼容QQ内置,微信内置,Firefo ...

  8. BIO聊天室(群聊+私聊)

    功能:群聊+私发+上线提醒+下线提醒+查询在线用户 文件 Utils FinalValue Message Server Client Receive Send Utils package morem ...

  9. HTML5 之WebSocket入门demo和简易聊天室

    HTML5 WebSocket WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. 在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏 ...

最新文章

  1. 动态改变_【清涧一小动态】改变从学习做起,教育从家庭出发——延安市家庭教育协会助力清涧县第一小学全方位提升育人水平...
  2. 防止IFRAME页被嵌套
  3. Python(basic)Day-1
  4. Struts1.x和Struts2.0的Action的区别
  5. dama数据管理知识体系指南第二版pdf_DMBOK数据管理 - CDMP认证培训
  6. 分别求两个整数的最大公约数和最小公倍数。_看不懂辗转相除法求最小公约数?以身相许那种哦!...
  7. 我的ActiveRecord学习之路(一)
  8. Asp.net 构建可扩展的的Comet Web 应用(一)
  9. 将循环结果写入到新建的dataframe中
  10. stm8s103头文件
  11. C语言发展史的点点滴滴
  12. 影响因素分析论文用什么模型好?
  13. 极限、连续、导数与微分
  14. 数显之家快讯:【SHIO世硕心语】便携显示器可能是智能手机变身电脑最好的配件了!
  15. golang学习资源
  16. VRTK插件详解四:部分自带案例分析
  17. Maven第3篇:详解maven解决依赖问题
  18. stm32RCT6 使用NTC热敏电阻实现温度报警器
  19. error怎么开机 fan_笔记本开机显示fan error怎么解决?
  20. php 安装参数 ./configure

热门文章

  1. 独角兽公司ucloud照片Linux存储/文件存储工程师
  2. CAD高版本转低版本的方法有哪些?
  3. 计算机存储—大话存储II读书
  4. Pr 视频效果:调整
  5. 远程开启或唤醒休眠的计算机
  6. AVL树的理解及自写AVL树
  7. 2022年双十一洗面奶选购指南
  8. 嵌入式软件工程师岗位,要具备哪些能力??
  9. js调试技巧(通过debugger调试)
  10. 【机试题】2014大疆嵌入式笔试题(附超详细解答,下篇)