Golang Go语言实现的高并发聊天程序

发布于 1周前 作者 nodeper 来自 Go语言

Golang Go语言实现的高并发聊天程序

献上代码,聊表敬意

https://github.com/ItsWewin/go-chat

目前功能较少,欢迎 issue 中提你想要的功能,issue 中要求的功能,优先添加。欢迎吐槽或 star

项目简介

这是使用 Golang 网络编程实现的一个多人在线聊天程序,使用 goroutine 达到高并发的效果,使用 redis 来保存用户的注册信息

项目由服务端和客户端两部分组成,服务端和客户端代码基本独立,server 目录下是服务端代码,client 目录下是客户端代码,commen 目录下的包由服务端和客户端共同使用

项目目录结构如下:

.
├── README.md
├── client // 客户端代码
│   ├── logger // 自定义的日志打印器
│   │   └── logger.go
│   ├── main.go // 主函数
│   ├── model // model 层
│   │   └── user.go
│   ├── process // 处理与服务器端的连接,收发消息
│   │   ├── messageProcess.go
│   │   ├── serverProcess.go
│   │   └── userProcess.go
│   └── utils
│       └── utils.go
├── commen // 客户端和服务端公用代码,主要用来定义客户端和服务端之间通信约定的消息
│   └── message
│       └── message.go
└── server // 服务端代码
    ├── main // 主函数
    │   ├── main.go
    │   └── redis.go
    ├── model // model 层
    │   ├── clientConn.go
    │   ├── error.go
    │   ├── user.go
    │   └── userDao.go
    ├── process // 处理与客户端的连接,收发消息
    │   ├── groupMessageProcess.go // 处理群消息
    │   ├── onlineInfoProcess.go // 显示在线用户
    │   ├── pointToPointMessageProcess.go // 处理点对点聊天消息
    │   ├── processor.go // 消息处理器入口
    │   └── userProcess.go // 处理和用户登陆注册相关消息
    └── utils 
        └── utils.go

本地运行本项目(Unix 系统下)

下载项目

下载项目到本地的 GOPATH 目录下(后面会提供 go get 的方式以方便使用),由于这是 Golang 项目,所以需要你本地有 Golang 的运行环境

cd ${GOPATH}/src
git clone [email protected]:ItsWewin/go-chat.git

编译和运行

编译并运行服务端代码

go build -o server go-chat/server/main
./server

编译并运行客户端代码

go build -o server go-chat/server/main
./server

这样就大功告成,你就可以在本地体验本项目了( ps:你要是不想用微信或者 QQ 聊天可以尝试下把程度搭建在自己的服务器上,喊上你的道友们用这个软件来聊天 [手动补个捂脸的表情包] )

项目概况

项目目前实现了如下功能:

  1. 用户注册、登陆
  2. 显示所有在线用户列表
  3. 发送群消息(目前是发送给在线的所有用户)
  4. 私聊某一个用户
  5. 按照消息的类型(info, notice, warn, error, success) 使用不同的颜色打印消息( Unix 和 window 均支持)
  6. 其他的有空再继续扩展... (欢迎提 issue,issue 提到的优先实现)

项目效果图

注册

sign-up

登陆

sign-in

显示在线用户列表

online-user-list

群聊

group-message-1.png group-message-2.png

私聊

point-to-point.png point-to-point2.png


更多关于Golang Go语言实现的高并发聊天程序的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

43 回复

欢迎道友们 Issue 或者 star

更多关于Golang Go语言实现的高并发聊天程序的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


功能好说,性能呢?测试加一下?

不错,可以写一下 roadmap,如果要继续完善的话

关键部分都使用了 goroutine 并发效果应该是不会差,但是程序员不能说 “应该”(哈哈哈),测完后再来回复你。

好建议,我找空写下

看了一眼代码,强迫症又犯了…拼写错误改改? buf[:4]和 buf[0:4]没区别,用一种可好? recover 最好处理一下,不然一个 coroutine 挂了整个进程就废了,直接用 binary.Read 比这样自己算简单多了,消息缓冲如果只开 10240 的话,消息长度给个 int16 是不是更好还更安全?

感谢,给 10 个金豆聊表敬意,提到的问题会解决。

话说,你要是想再进化一些或者兼容性更大些,websocket 了解一下?回头接个 h5 前端聊天美滋滋~

commen,看着膈应

我刚好在学习 go,给你个 star

感谢建议,等功能完善差不多再考虑吧

改了,凄惨的拼写

4 exist 存在即合理

commen
common
?????

性能测试呢,用数据说话


可怕的拼写。

后面会补上的

学生作业般的即视感

高并发是多少并发?没测试数据就说什么高并发

客户端服务端一样的编译命令?话说楼主大几了?

看了下代码,基本上就是一个 java 项目改成 go,然后仅仅用了协程而已

命令行的聊天真的能用嘛。。。??

go 语言默认高并发

这就是老韩的那个 go 聊天室 翻版吗

韩顺平老师课堂作业即视感




是基于韩老师的那个项目做的。想做个练手项目,自己也没好的想法,感觉老师这个点在还不错,就基于这个做了。目前和韩老师那个不同地方是加了点对点聊天和日志分级使用不同的颜色输出。后面计划添加服务端日志记录,以及增加其他聊天相关功能模块和文件传输功能。

前面也有别人提到,测试会加上。

或者说不是要非得强调是高并发啊,改成用 go 实现了一个 im 的 demo

应该要有测试,或者如楼上说 不强调高并发。

标题党在这里没用。觉得有用的自然会看。

HikariCP Java 里的 连接池 它里面有基准测试和
简单对比,以及其他测试

建议搞个端到端加密和无服务端存储(服务端只存元数据),再搞个易用的客户端,这样做大做强就会指日可待了

go 语言默认高并发 2333333333

这个项目真的是个坑…
- 各种各样的拼写错误, 逼死强迫症
- 没有用到包管理器 ,
- 代码没有遵循 go 语言规范
- 连一个像样的 readme 都没有…

本来就是随意写的,没想到有这么多人关注,会好好完善下的。

好的,感谢建议,测试还没来得及高。但是我该怎么改标题,这里的 V2EX 的文章好像没法编辑

端对端逃过了数据监控,法律怕是不允许呀。我不太了解,想着说的。

驼峰不建议,很明显的 Java 风格,文件命名建议用下划线

还有,用例测试呢?

顺便提下,我写了个很简单的 pid file 文件生成库,应该对这个项目有帮助,自荐下

message.go 定义的太简单了。 这个应该是基础,而且是最重要的,应该通过这个就可以看到你基本的通信的处理。
另外对于 server 来说他应该不管是点对点 还是 group 的,和 client 之间交互 session 添加加上用户的 ID 即可转发。这样也方便做继续添加删除等处理。

ReadData() 中可以考虑使用 io.ReadFull()

关于您提到的使用Golang(Go语言)实现的高并发聊天程序,这里有几个关键点和技术要点值得分享:

  1. 并发处理:Go语言以其强大的并发处理能力著称,通过goroutines和channels可以高效地处理大量并发连接。每个用户连接可以作为一个goroutine来处理,使用channels进行通信,以实现非阻塞的I/O操作。

  2. WebSocket:为了实现实时通信,通常会选择WebSocket协议。Go语言有多个优秀的WebSocket库,如gorilla/websocket,可以方便地建立和维护WebSocket连接。

  3. 消息广播:在聊天程序中,消息需要广播给所有连接的用户。可以使用一个全局的消息队列或者通道,所有goroutines监听这个队列,一旦有新消息就广播出去。

  4. 心跳检测:为了维持连接的有效性,需要实现心跳检测机制。定期发送心跳包以检测连接是否仍然活跃,如果连接断开则及时释放资源。

  5. 安全性:在高并发环境下,安全性尤为重要。需要确保数据传输的加密、用户身份验证以及防止恶意攻击(如DDoS攻击)。

  6. 性能优化:根据实际负载情况,可能需要对程序进行性能调优,包括优化数据结构、减少内存分配、使用连接池等。

综上所述,使用Go语言实现高并发聊天程序是一个既挑战又充满乐趣的任务。通过合理利用Go语言的并发特性和强大的生态库,可以构建出高效、稳定且易于维护的聊天系统。

回到顶部