来源:AI开发日志公众号专辑「Build Your Own X With AI」
原文链接:https://mp.weixin.qq.com/s?__biz=MzUxMjg3MjE2OA==&mid=2247485970&idx=1&sn=cb0990c9b2d6106233796dd82d5de004&chksm=f95c9195ce2b18838f86e195fd9421dde7a1b4d9a3847a9b77693c1202217fac5eac12175e48#rd

使用 SDL 的聊天室应用程序

这是一个使用 C 语言、SDL2 和套接字编程构建的简单多客户端聊天室应用程序。该项目包含一个管理多个客户端连接的服务器和一个使用 SDL2 构建的图形化客户端。

功能

多客户端支持(最多 10 个并发用户)

实时消息广播

使用 SDL2 的图形用户界面

用户加入/离开通知

在线用户列表

简洁干净的设计

架构

服务器

:多线程 TCP 服务器,处理客户端连接

客户端

:带有网络通信功能的基于 SDL2 的图形界面

协议

:基于不同消息类型(加入、离开、文本、用户列表)的简单消息协议

前提条件

macOS

brew install sdl2 sdl2_ttf

Ubuntu/Debian

sudo apt-get install libsdl2-dev libsdl2-ttf-dev

Fedora

sudo dnf install SDL2-devel SDL2_ttf-devel

构建

构建服务器和客户端:

make

仅构建服务器:

make server

仅构建客户端:

make client

清理构建文件:

make clean

运行

启动服务器

在一个终端中:

./bin/server

服务器将开始在 8888 端口监听。

启动客户端(多个)

在另一个终端(或多个终端以启动多个客户端):

./bin/client <用户名> <服务器 IP="">

示例:

./bin/client Alice 127.0.0.1

./bin/client Bob 127.0.0.1

./bin/client Charlie 127.0.0.1

使用方法

先启动服务器

使用不同的用户名启动一个或多个客户端

在客户端窗口底部的输入框中输入消息

按回车键发送消息

所有已连接的客户端将实时接收消息

项目结构

chatroom/

├── include/

│   └── common.h          # 通用定义和消息结构

├── src/

│   ├── server.c          # 服务器实现

│   └── client.c          # 带有 SDL 图形界面的客户端实现

├── bin/                  # 编译后的二进制文件(构建后生成)

│   ├── server

│   └── client

├── Makefile              # 构建配置

└── README.md             # 本文件

网络协议

应用程序使用简单的消息结构:

typedefstruct {

int type;                    // 消息类型(加入、离开、文本、用户列表)

char username[32];           // 发送者的用户名

char content[1024];          // 消息内容

} Message;

消息类型:

MSG_JOIN (1)

:用户加入聊天室

MSG_LEAVE (2)

:用户离开聊天室

MSG_TEXT (3)

:常规文本消息

MSG_USER_LIST (4)

:在线用户列表

配置

您可以在 include/common.h 中修改这些常量:

PORT

:服务器端口(默认:8888)

MAX_CLIENTS

:最大并发客户端数(默认:10)

BUFFER_SIZE

:消息缓冲区大小(默认:1024)

USERNAME_SIZE

:用户名最大长度(默认:32)

窗口尺寸可以在 src/client.c 中更改:

WINDOW_WIDTH

:客户端窗口宽度(默认:800)

WINDOW_HEIGHT

:客户端窗口高度(默认:600)

故障排除

字体加载错误

如果出现字体加载错误,客户端会尝试以下路径:

macOS:/System/Library/Fonts/Helvetica.ttc

Linux:/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf

您可以修改 src/client.c 第 258 行的字体路径,以匹配您系统的字体位置。

端口已被使用

如果出现“地址已在使用中”错误,您可以:

等待几秒钟,让操作系统释放端口

在 include/common.h 中更改 PORT 常量

连接被拒绝

请确保:

启动客户端前服务器正在运行

您使用的是正确的服务器 IP 地址

防火墙没有阻止端口

局限性

没有消息历史记录持久化

没有加密(消息以明文发送)

没有身份验证

最大消息长度:1024 字节

最大用户名长度:32 个字符

最大并发客户端数:10 个

未来改进

消息加密(TLS/SSL)

用户身份验证

消息历史记录

文件共享

私人消息

表情符号支持

更好的错误处理

通过命令行或配置文件进行可配置设置

许可证

详情请参见 LICENSE 文件。

image-1