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
下载项目到本地的 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
wewin OP 欢迎道友们 Issue 或者 star
|
2
sunny352787 2019-06-15 17:39:28 +08:00
功能好说,性能呢?测试加一下?
|
3
hyyou2010 2019-06-15 17:41:06 +08:00
不错,可以写一下 roadmap,如果要继续完善的话
|
4
wewin OP @sunny352787 关键部分都使用了 goroutine 并发效果应该是不会差,但是程序员不能说 “应该”(哈哈哈),测完后再来回复你。
|
6
sunny352787 2019-06-15 17:49:24 +08:00 1
看了一眼代码,强迫症又犯了...拼写错误改改? buf[:4]和 buf[0:4]没区别,用一种可好? recover 最好处理一下,不然一个 coroutine 挂了整个进程就废了,直接用 binary.Read 比这样自己算简单多了,消息缓冲如果只开 10240 的话,消息长度给个 int16 是不是更好还更安全?
|
7
wewin OP @sunny352787 感谢,给 10 个金豆聊表敬意,提到的问题会解决。
|
8
sunny352787 2019-06-15 18:04:43 +08:00
@wewin 话说,你要是想再进化一些或者兼容性更大些,websocket 了解一下?回头接个 h5 前端聊天美滋滋~
|
9
wangsongyan 2019-06-15 18:11:18 +08:00 via iPhone
commen,看着膈应
|
10
luosuosile 2019-06-15 18:18:49 +08:00
我刚好在学习 go,给你个 star
|
11
wewin OP @sunny352787 感谢建议,等功能完善差不多再考虑吧
|
12
wewin OP @wangsongyan 改了,凄惨的拼写
|
14
acehow 2019-06-15 19:18:40 +08:00 via Android
4 exist 存在即合理
|
15
sdtfll 2019-06-15 20:41:59 +08:00 via Android
commen
common ????? |
16
lzynb 2019-06-15 21:54:55 +08:00
性能测试呢,用数据说话
|
19
blless 2019-06-16 03:41:40 +08:00 via Android 3
学生作业般的即视感
|
20
littlewing 2019-06-16 04:02:53 +08:00 via Android
高并发是多少并发?没测试数据就说什么高并发
|
21
hhyvs111 2019-06-16 06:08:52 +08:00 via iPhone
客户端服务端一样的编译命令?话说楼主大几了?
|
22
hhyvs111 2019-06-16 06:14:53 +08:00 via iPhone
看了下代码,基本上就是一个 java 项目改成 go,然后仅仅用了协程而已
|
23
lychnis 2019-06-16 07:11:07 +08:00 via Android
命令行的聊天真的能用嘛。。。??
|
24
Cbdy 2019-06-16 07:34:59 +08:00 via Android
@sunny352787 go 语言默认高并发
|
25
kiwier 2019-06-16 08:15:18 +08:00
这就是老韩的那个 go 聊天室 翻版吗
|
26
xx19941215 2019-06-16 08:54:02 +08:00 via iPhone
韩顺平老师课堂作业即视感
|
27
wewin OP @kiwier
@xx19941215 @blless 是基于韩老师的那个项目做的。想做个练手项目,自己也没好的想法,感觉老师这个点在还不错,就基于这个做了。目前和韩老师那个不同地方是加了点对点聊天和日志分级使用不同的颜色输出。后面计划添加服务端日志记录,以及增加其他聊天相关功能模块和文件传输功能。 |
28
wewin OP @littlewing 前面也有别人提到,测试会加上。
|
29
littlewing 2019-06-16 12:35:04 +08:00 via iPhone
@wewin 或者说不是要非得强调是高并发啊,改成用 go 实现了一个 im 的 demo
|
30
rainmakeroly 2019-06-16 13:24:20 +08:00 via Android
应该要有测试,或者如楼上说 不强调高并发。
标题党在这里没用。觉得有用的自然会看。 HikariCP Java 里的 连接池 它里面有基准测试和 简单对比,以及其他测试 |
31
mogging 2019-06-16 15:33:58 +08:00
建议搞个端到端加密和无服务端存储(服务端只存元数据),再搞个易用的客户端,这样做大做强就会指日可待了
|
33
shadeofgod 2019-06-16 19:19:27 +08:00
go 语言默认高并发 2333333333
|
34
Tomotoes 2019-06-16 19:46:18 +08:00 1
这个项目真的是个坑...
- 各种各样的拼写错误, 逼死强迫症 - 没有用到包管理器 , - 代码没有遵循 go 语言规范 - 连一个像样的 readme 都没有.. |
36
wewin OP @rainmakeroly 好的,感谢建议,测试还没来得及高。但是我该怎么改标题,这里的 V2EX 的文章好像没法编辑
|
38
feelinglucky 2019-06-17 00:16:48 +08:00
驼峰不建议,很明显的 Java 风格,文件命名建议用下划线
还有,用例测试呢? |
39
feelinglucky 2019-06-17 00:18:28 +08:00
顺便提下,我写了个很简单的 pid file 文件生成库,应该对这个项目有帮助,自荐下
|
40
feelinglucky 2019-06-17 00:19:30 +08:00
|
41
maxmin 2019-06-17 09:33:54 +08:00
message.go 定义的太简单了。 这个应该是基础,而且是最重要的,应该通过这个就可以看到你基本的通信的处理。
另外对于 server 来说他应该不管是点对点 还是 group 的,和 client 之间交互 session 添加加上用户的 ID 即可转发。这样也方便做继续添加删除等处理。 |
42
lanjz 2019-06-17 10:49:22 +08:00
ReadData() 中可以考虑使用 io.ReadFull()
|