本项目是一个用 Go 实现的教学/演示型即时通讯(IM)服务与客户端。代码结构简单,便于理解基于 TCP 的聊天服务器、用户管理、消息广播与简单的私聊/改名指令实现。
client.go— 控制台客户端实现(包含菜单、发送/接收逻辑)server.go— 聊天服务器主逻辑(连接处理、广播、消息通道)user.go— 用户抽象(在线/离线、消息处理、私聊/改名/查询在线用户)main.go— 启动服务器的入口go.mod— 模块/Go 版本信息
说明:本仓库包含服务端和客户端的源文件。它们都在
package main,但有各自的main()入口,因此请按下面的说明分别构建/运行服务端和客户端。
- 多用户在线广播聊天
- 私聊(to|用户名|消息)
- 查询在线用户(who)
- 修改用户名(rename|新用户名)
- 超时强制下线(服务端默认 300s 无活动)
客户端通过向服务器发送文本命令与消息(每条以换行符 \n 结束)。常见命令:
who— 请求服务器返回当前在线用户列表rename|新用户名— 修改当前客户端用户名(若已被占用,服务器会返回提示)to|用户名|消息内容— 向指定用户名发送私聊消息- 其它任何非以上格式的文本均视为群聊消息,由服务器广播给所有在线用户
服务器广播消息的格式为:[addr]name: message(服务器内部发送时会在每条消息后追加换行)
注意:消息结尾需要换行符(客户端的发送函数会自动在文本后追加 \n)。
- 需要安装 Go,项目
go.mod指定了go 1.25.3(向后兼容通常可在较新的 Go 版本上运行)。
在 Windows(PowerShell)下的构建与运行示例:
cd D:\Learn\Computer\Go\IM_System
# 单独构建 server(只包含 server 相关的 .go 文件)
go build -o im_server.exe main.go server.go user.go或者直接运行(不生成二进制):
go run main.go server.go user.gocd D:\Learn\Computer\Go\IM_System
go build -o im_client.exe client.go或者直接运行:
go run client.go- 在一个终端启动服务端:
.\im_server.exe
# 或者 go run main.go server.go user.go- 在另一个或多个终端启动客户端:
.\im_client.exe -ip 127.0.0.1 -port 5080
# 或者 go run client.go -ip 127.0.0.1 -port 5080客户端启动后会显示菜单(公聊 / 私聊 / 修改用户名 / 退出),按提示输入即可。
- 改名:在客户端选择“3. 修改用户名”,输入
张三,客户端向服务器发送rename|张三。 - 查看在线用户:选择私聊模式或直接发送
who,服务器会返回在线列表。 - 私聊:使用
to|李四|你好格式发送私聊消息。
- 不能一次性对所有文件运行
go build,因为client.go与main.go(server 的入口)都定义了main(),若不指定文件将导致重复main定义错误。请按上面方法分别构建服务端与客户端。 - 用户名必须唯一;改名到已存在的用户名会被拒绝。
- 消息是以简单文本协议实现,未做加密或认证,适合学习/演示,不适合生产环境。
- 将 client/server 拆分到不同的包或子目录,使用模块化命令行构建脚本
- 增加 JSON 或二进制协议以支持更复杂的消息类型
- 添加用户认证、持久化在线/聊天记录、群组管理、消息撤回等功能
- 增加单元测试与集成测试