首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
beego
V2EX  ›  Go

Golang 实现的高并发聊天程序

  •  
  •   wewin · 36 天前 · 4491 次点击
    这是一个创建于 36 天前的主题,其中的信息可能已经有所发展或是发生改变。

    献上代码,聊表敬意

    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

    42 回复  |  直到 2019-06-17 10:49:22 +08:00
        1
    wewin   36 天前
    欢迎道友们 Issue 或者 star
        2
    sunny352787   36 天前
    功能好说,性能呢?测试加一下?
        3
    hyyou2010   36 天前
    不错,可以写一下 roadmap,如果要继续完善的话
        4
    wewin   36 天前
    @sunny352787 关键部分都使用了 goroutine 并发效果应该是不会差,但是程序员不能说 “应该”(哈哈哈),测完后再来回复你。
        5
    wewin   36 天前
    @hyyou2010 好建议,我找空写下
        6
    sunny352787   36 天前   ♥ 1
    看了一眼代码,强迫症又犯了...拼写错误改改? buf[:4]和 buf[0:4]没区别,用一种可好? recover 最好处理一下,不然一个 coroutine 挂了整个进程就废了,直接用 binary.Read 比这样自己算简单多了,消息缓冲如果只开 10240 的话,消息长度给个 int16 是不是更好还更安全?
        7
    wewin   36 天前
    @sunny352787 感谢,给 10 个金豆聊表敬意,提到的问题会解决。
        8
    sunny352787   36 天前
    @wewin 话说,你要是想再进化一些或者兼容性更大些,websocket 了解一下?回头接个 h5 前端聊天美滋滋~
        9
    wangsongyan   36 天前 via iPhone
    commen,看着膈应
        10
    luosuosile   36 天前
    我刚好在学习 go,给你个 star
        11
    wewin   36 天前
    @sunny352787 感谢建议,等功能完善差不多再考虑吧
        12
    wewin   36 天前
    @wangsongyan 改了,凄惨的拼写
        13
    wewin   36 天前
    @wewin 谢谢!
        14
    acehow   36 天前 via Android
    4 exist 存在即合理
        15
    sdtfll   36 天前 via Android
    commen
    common
    ?????
        16
    lzynb   36 天前
    性能测试呢,用数据说话
        17
    wewin   36 天前
    @sdtfll
    @acehow 可怕的拼写。
        18
    wewin   36 天前
    @lzynb 后面会补上的
        19
    blless   35 天前 via Android   ♥ 3
    学生作业般的即视感
        20
    littlewing   35 天前 via Android
    高并发是多少并发?没测试数据就说什么高并发
        21
    hhyvs111   35 天前 via iPhone
    客户端服务端一样的编译命令?话说楼主大几了?
        22
    hhyvs111   35 天前 via iPhone
    看了下代码,基本上就是一个 java 项目改成 go,然后仅仅用了协程而已
        23
    lychnis   35 天前 via Android
    命令行的聊天真的能用嘛。。。??
        24
    Cbdy   35 天前 via Android
    @sunny352787 go 语言默认高并发
        25
    kiwier   35 天前
    这就是老韩的那个 go 聊天室 翻版吗
        26
    xx19941215   35 天前 via iPhone
    韩顺平老师课堂作业即视感
        27
    wewin   35 天前
    @kiwier
    @xx19941215
    @blless
    是基于韩老师的那个项目做的。想做个练手项目,自己也没好的想法,感觉老师这个点在还不错,就基于这个做了。目前和韩老师那个不同地方是加了点对点聊天和日志分级使用不同的颜色输出。后面计划添加服务端日志记录,以及增加其他聊天相关功能模块和文件传输功能。
        28
    wewin   35 天前
    @littlewing 前面也有别人提到,测试会加上。
        29
    littlewing   35 天前 via iPhone
    @wewin 或者说不是要非得强调是高并发啊,改成用 go 实现了一个 im 的 demo
        30
    rainmakeroly   35 天前 via Android
    应该要有测试,或者如楼上说 不强调高并发。

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

    HikariCP Java 里的 连接池 它里面有基准测试和
    简单对比,以及其他测试
        31
    mogging   35 天前
    建议搞个端到端加密和无服务端存储(服务端只存元数据),再搞个易用的客户端,这样做大做强就会指日可待了
        32
    kiwier   35 天前 via iPhone
    @wewin 加油
        33
    shadeofgod   35 天前
    go 语言默认高并发 2333333333
        34
    Tomotoes   35 天前   ♥ 1
    这个项目真的是个坑...
    - 各种各样的拼写错误, 逼死强迫症
    - 没有用到包管理器 ,
    - 代码没有遵循 go 语言规范
    - 连一个像样的 readme 都没有..
        35
    wewin   35 天前
    @Tomotoes 本来就是随意写的,没想到有这么多人关注,会好好完善下的。
        36
    wewin   35 天前
    @rainmakeroly 好的,感谢建议,测试还没来得及高。但是我该怎么改标题,这里的 V2EX 的文章好像没法编辑
        37
    wewin   35 天前
    @mogging 端对端逃过了数据监控,法律怕是不允许呀。我不太了解,想着说的。
        38
    feelinglucky   35 天前
    驼峰不建议,很明显的 Java 风格,文件命名建议用下划线

    还有,用例测试呢?
        39
    feelinglucky   35 天前
    顺便提下,我写了个很简单的 pid file 文件生成库,应该对这个项目有帮助,自荐下
        40
    feelinglucky   35 天前
        41
    maxmin   34 天前
    message.go 定义的太简单了。 这个应该是基础,而且是最重要的,应该通过这个就可以看到你基本的通信的处理。
    另外对于 server 来说他应该不管是点对点 还是 group 的,和 client 之间交互 session 添加加上用户的 ID 即可转发。这样也方便做继续添加删除等处理。
        42
    lanjz   34 天前
    ReadData() 中可以考虑使用 io.ReadFull()
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   767 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 21ms · UTC 19:26 · PVG 03:26 · LAX 12:26 · JFK 15:26
    ♥ Do have faith in what you're doing.