基于golang高并发特性开发的聊天室。
项目是如何设计与实现的?
客户端启动的时候进行初始化,最重要的就是两个管道,一个管道用于接受客户端请求信息,一个管道用于接受服务器发送的信息,同时开启三个协程,主协程用于处理用户的登录和注册,一个子协程用于接受连接中的数据,另一个子协程用于通过连接发送数据,以下是具体实现细节:
-
注册
用户输入用户名和密码,通过子协程发送登录请求到 客户端接受信息的管道,接着通过子协程发送登录请求到服务器,服务器接收请求验证成功就会发送“success”,客户端接收协程收到之后注册成功,进行用户登录
-
登录
还是一样的输入用户名和密码,通过子协程发送请求,服务器验证成功之后登录成功,之后继续开启两个协程,一个协程用于接受服务器的信息并显示在终端,另一个协程用于客户端信息的输入,可以直接发送消息,也可以通过to发送私聊消息,发送quit可以退出聊天室,发送clientlist可以查看当前在线用户。
-
接受服务器信息的子协程
将服务器发送的信息放入到管道中
-
向服务器发送信息的子协程
从客户端输入信息的管道中拿出数据发送到服务器
-
消息显示协程
从管道中拿出数据,打印到终端
-
信息输入的协程
将输入的信息放入到管道,通过发送信息的子协程发送到服务器
服务端启动的时候进行初始化,信息管道,还有一个哈希表用于缓存所有连接对象的信息,开启两个协程,子协程用于广播消息,主协程用于持续监听等待客户端的连接,当用客户端连接的时候,首先对这个客户端进行初始化,接发信息的管道,连接对象,同时开启三个协程,一个协程处理用户登录注册的认证,一个协程用于向该客户端发送信息,还有一个用于接受该用户的信息,下面是具体实现细节:
-
处理用户登录注册的协程
注册主要是判断数据库中是否存在相同的用户名,没有的话发送“success”到该客户端 发送信息的管道,通过子协程发送给该客户端。登录主要是判断用户名和密码是否匹配,成功还是一样的处理,向所有的连接对象发送该用户进入聊天室的提示信息,同时将该连接对象放入到哈希表中,开启接受该用户信息的协程
-
接收该用户信息的协程
通过从接受信息的管道中拿取数据,并将数据放入到服务器的信息管道中进行处理
-
向该客户端发送信息的协程
通过将管道中的信息发送给该客户端
-
接收该用户的信息协程
主要是通过连接接收信息,放入到接收信息的管道
-
广播信息的协程
将服务器管道中的信息取出,根据信息内容不同的处理,如果是quit,从哈希表中删除该用户,如果是userlist,遍历哈希表,将所有在线用户名发送给该客户端,如果有to标志,将信息发送给指定的用户,普通信息则遍历所有的连接对象,将信息放入到每个客户端的管道中然后发送。
- Get a free API Key at https://example.com
- Clone the repo
git clone https://github.com/RobKing9/RobKing_Goroutine_ChatRoom.git
.
|-- README.md
|-- client
| |-- client.go 主程序,初始客户端,连接服务器
| |-- data.go 接收服务器信息放入管道,拿取管道信息发送给服务器
| |-- login.go 用户登录
| |-- message.go 从管道中拿出信息显示到终端,用户发送数据到管道中
| `-- register.go 用户注册
|-- server
| |-- broadcast.go 广播消息
| |-- clientAuth.go 用户认证
| |-- data.go 数据接收和发送
| |-- mysql.go 连接数据库及相关的操作
| `-- server.go 服务器主协程,等待客户端连接
通过docker部署在服务器中,用户可以通过不同的网络连接交流
请阅读CONTRIBUTING.md 查阅为该项目做出贡献的开发者。
贡献使开源社区成为一个学习、激励和创造的绝佳场所。你所作的任何贡献都是非常感谢的。
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
该项目使用Git进行版本管理。您可以在repository参看当前可用版本。
博客
您也可以在贡献者名单中参看所有参与该项目的开发者。
该项目签署了MIT 授权许可,详情请参阅 LICENSE.txt