Linux课程设计基于Socket的网络聊天系统C语言MySQLGTK2项目简介本项目是一个基于Linux平台的网络即时通信工具使用C语言开发采用TCP Socket通信 select多路复用实现多客户端并发处理MySQL存储用户数据和聊天记录GTK 2.0构建图形界面。支持用户注册登录、私聊、群聊、离线消息等完整功能。项目已开源文末附仓库地址。技术栈模块技术编程语言C语言网络通信TCP Socket select多路复用数据库MySQL 8.0图形界面GTK 2.0编译工具GCC Makefile多线程POSIX pthread系统架构项目采用经典的C/S客户端/服务器架构┌─────────────┐ TCP Socket ┌─────────────┐ │ 客户端 │ ◄──────────────► │ 服务器 │ │ (GTK2 GUI) │ │ (select) │ └─────────────┘ └──────┬──────┘ │ ┌──────▼──────┐ │ MySQL │ │ 数据库 │ └─────────────┘项目结构Linux课程设计/ ├── src/ # 源代码 │ ├── common/ │ │ └── protocol.h # 通信协议定义消息类型、结构体 │ ├── server/ │ │ ├── server.c # 服务器主程序select多路复用 │ │ ├── database.h # 数据库操作头文件 │ │ └── database.c # 数据库操作实现 │ └── client/ │ └── client.c # 客户端程序GTK2界面 ├── sql/ │ └── init.sql # 数据库初始化脚本 ├── doc/ # 文档 ├── Makefile # 编译配置 └── README.md核心设计1. 通信协议设计所有客户端与服务器之间的通信使用统一的Message结构体typedefstruct{inttype;// 消息类型intstatus;// 状态码charsender[MAX_NAME_LEN];// 发送者用户名charreceiver[MAX_NAME_LEN];// 接收者用户名(或群名)charcontent[MAX_MSG_LEN];// 消息内容charnickname[MAX_NAME_LEN];// 昵称charextra[MAX_MSG_LEN];// 额外数据(成员列表等)time_ttimestamp;// 时间戳}Message;消息类型通过枚举定义涵盖注册、登录、私聊、群聊、群管理等全部操作enumMsgType{MSG_REGISTER1,// 注册请求MSG_LOGIN,// 登录请求MSG_LOGOUT,// 登出请求MSG_CHAT,// 私聊消息MSG_BROADCAST,// 群发消息MSG_CREATE_GROUP,// 创建群聊MSG_GROUP_CHAT,// 群聊消息MSG_INVITE_GROUP,// 邀请加入群聊MSG_KICK_GROUP,// 踢出群聊// ... 更多类型};2. 服务器端 - select多路复用服务器使用select()实现单线程多客户端并发处理避免了多线程的复杂同步问题while(running){FD_ZERO(read_fds);FD_SET(server_sockfd,read_fds);max_fdserver_sockfd;// 将所有在线用户的fd加入监听集合for(i0;iMAX_USERS;i){if(online_users[i].is_online){FD_SET(online_users[i].sockfd,read_fds);if(online_users[i].sockfdmax_fd)max_fdonline_users[i].sockfd;}}// 阻塞等待事件if(select(max_fd1,read_fds,NULL,NULL,NULL)0){if(errnoEINTR)continue;break;}// 处理新连接if(FD_ISSET(server_sockfd,read_fds)){new_fdaccept(server_sockfd,...);// 加入待验证列表}// 处理已登录用户的消息for(i0;iMAX_USERS;i){if(online_users[i].is_onlineFD_ISSET(online_users[i].sockfd,read_fds)){handle_client_message(online_users[i].sockfd);}}}3. 客户端 - GTK2图形界面 多线程接收客户端主线程运行GTK事件循环另开一个pthread线程负责接收服务器消息// 登录成功后启动接收线程pthread_ttid;pthread_create(tid,NULL,recv_thread_func,NULL);pthread_detach(tid);接收线程通过g_idle_add()将UI更新操作调度到GTK主线程执行避免多线程直接操作GTK导致崩溃staticvoid*recv_thread_func(void*arg){Message msg;while(1){recv(sockfd,msg,sizeof(msg),0);switch(msg.type){caseMSG_CHAT:// 将消息显示调度到主线程g_idle_add(append_message_idle,strdup(line));break;// ...}}}4. 数据库设计MySQL数据库包含以下核心表表名用途users用户信息用户名、密码、昵称、在线状态messages离线消息存储chat_history聊天记录持久化groups_tbl群聊信息group_members群成员关系离线消息机制当接收方不在线时消息存入messages表用户上线后自动推送。// 发送方不在线时存储离线消息if(recv_idx0){db_store_offline_msg(msg-sender,msg-receiver,msg-content);}// 用户上线时推送离线消息staticvoidsend_offline_messages(intfd,constchar*username){Message*msgsdb_get_offline_msgs(username,count);for(i0;icount;i){send(fd,msgs[i],sizeof(Message),0);}}功能特性用户管理注册、登录验证、密码校验、重复登录检测私聊点对点实时消息传输群发消息向所有在线用户广播群聊管理创建群聊、邀请成员、踢出成员、退出群聊、解散群聊离线消息用户不在线时自动存储上线后推送聊天记录所有消息持久化存储支持历史查询在线状态实时显示用户上下线状态编译与运行环境要求Linux操作系统Ubuntu 20.04 / Fedora 35GCC 9.0MySQL 8.0GTK 2.0 开发库安装依赖Ubuntu/Debian:sudoapt-getinstallgccmakelibgtk2.0-dev libmysqlclient-dev mysql-serverFedora/RHEL:sudodnfinstallgccmakegtk2-devel mysql-devel mysql-server编译运行# 1. 初始化数据库sudosystemctl start mysqlmakedb# 2. 编译makeall# 3. 运行开两个终端./chat_server# 终端1启动服务器./chat_client# 终端2启动客户端运行效果客户端GTK界面包含登录/注册窗口输入用户名密码进行身份验证聊天主窗口左侧用户列表和群聊列表右侧消息显示区和输入框群聊管理创建群聊、邀请/踢出成员、退出/解散群聊的对话框关键代码片段消息转发私聊staticvoidhandle_chat(intfd,Message*msg){intrecv_idxfind_user_by_name(msg-receiver);if(recv_idx0){// 在线直接转发send(online_users[recv_idx].sockfd,msg,sizeof(Message),0);}else{// 离线存储到数据库db_store_offline_msg(msg-sender,msg-receiver,msg-content);}}群聊消息广播staticvoidhandle_group_chat(intfd,Message*msg){GroupInfo*groupfind_group(msg-receiver);// 转发给所有群成员除了发送者for(i0;igroup-member_count;i){intidxfind_user_by_name(group-members[i]);if(idx0online_users[idx].sockfd!fd){send(online_users[idx].sockfd,msg,sizeof(Message),0);}}}仓库地址GitHub: https://github.com/NiMark886/linux-chat-systemGitee: https://gitee.com/NiMark886/linux-chat-system总结本项目实现了一个功能完整的Linux网络聊天系统涵盖了Socket网络编程、多路复用I/O、MySQL数据库操作、GTK图形界面开发、多线程编程等Linux课程核心知识点。通过这个项目可以深入理解C/S架构的设计原理和Linux系统编程的实践技巧。如果对你有帮助欢迎 Star 支持
Linux课程设计:基于Socket的网络聊天系统(C语言+MySQL+GTK2)
Linux课程设计基于Socket的网络聊天系统C语言MySQLGTK2项目简介本项目是一个基于Linux平台的网络即时通信工具使用C语言开发采用TCP Socket通信 select多路复用实现多客户端并发处理MySQL存储用户数据和聊天记录GTK 2.0构建图形界面。支持用户注册登录、私聊、群聊、离线消息等完整功能。项目已开源文末附仓库地址。技术栈模块技术编程语言C语言网络通信TCP Socket select多路复用数据库MySQL 8.0图形界面GTK 2.0编译工具GCC Makefile多线程POSIX pthread系统架构项目采用经典的C/S客户端/服务器架构┌─────────────┐ TCP Socket ┌─────────────┐ │ 客户端 │ ◄──────────────► │ 服务器 │ │ (GTK2 GUI) │ │ (select) │ └─────────────┘ └──────┬──────┘ │ ┌──────▼──────┐ │ MySQL │ │ 数据库 │ └─────────────┘项目结构Linux课程设计/ ├── src/ # 源代码 │ ├── common/ │ │ └── protocol.h # 通信协议定义消息类型、结构体 │ ├── server/ │ │ ├── server.c # 服务器主程序select多路复用 │ │ ├── database.h # 数据库操作头文件 │ │ └── database.c # 数据库操作实现 │ └── client/ │ └── client.c # 客户端程序GTK2界面 ├── sql/ │ └── init.sql # 数据库初始化脚本 ├── doc/ # 文档 ├── Makefile # 编译配置 └── README.md核心设计1. 通信协议设计所有客户端与服务器之间的通信使用统一的Message结构体typedefstruct{inttype;// 消息类型intstatus;// 状态码charsender[MAX_NAME_LEN];// 发送者用户名charreceiver[MAX_NAME_LEN];// 接收者用户名(或群名)charcontent[MAX_MSG_LEN];// 消息内容charnickname[MAX_NAME_LEN];// 昵称charextra[MAX_MSG_LEN];// 额外数据(成员列表等)time_ttimestamp;// 时间戳}Message;消息类型通过枚举定义涵盖注册、登录、私聊、群聊、群管理等全部操作enumMsgType{MSG_REGISTER1,// 注册请求MSG_LOGIN,// 登录请求MSG_LOGOUT,// 登出请求MSG_CHAT,// 私聊消息MSG_BROADCAST,// 群发消息MSG_CREATE_GROUP,// 创建群聊MSG_GROUP_CHAT,// 群聊消息MSG_INVITE_GROUP,// 邀请加入群聊MSG_KICK_GROUP,// 踢出群聊// ... 更多类型};2. 服务器端 - select多路复用服务器使用select()实现单线程多客户端并发处理避免了多线程的复杂同步问题while(running){FD_ZERO(read_fds);FD_SET(server_sockfd,read_fds);max_fdserver_sockfd;// 将所有在线用户的fd加入监听集合for(i0;iMAX_USERS;i){if(online_users[i].is_online){FD_SET(online_users[i].sockfd,read_fds);if(online_users[i].sockfdmax_fd)max_fdonline_users[i].sockfd;}}// 阻塞等待事件if(select(max_fd1,read_fds,NULL,NULL,NULL)0){if(errnoEINTR)continue;break;}// 处理新连接if(FD_ISSET(server_sockfd,read_fds)){new_fdaccept(server_sockfd,...);// 加入待验证列表}// 处理已登录用户的消息for(i0;iMAX_USERS;i){if(online_users[i].is_onlineFD_ISSET(online_users[i].sockfd,read_fds)){handle_client_message(online_users[i].sockfd);}}}3. 客户端 - GTK2图形界面 多线程接收客户端主线程运行GTK事件循环另开一个pthread线程负责接收服务器消息// 登录成功后启动接收线程pthread_ttid;pthread_create(tid,NULL,recv_thread_func,NULL);pthread_detach(tid);接收线程通过g_idle_add()将UI更新操作调度到GTK主线程执行避免多线程直接操作GTK导致崩溃staticvoid*recv_thread_func(void*arg){Message msg;while(1){recv(sockfd,msg,sizeof(msg),0);switch(msg.type){caseMSG_CHAT:// 将消息显示调度到主线程g_idle_add(append_message_idle,strdup(line));break;// ...}}}4. 数据库设计MySQL数据库包含以下核心表表名用途users用户信息用户名、密码、昵称、在线状态messages离线消息存储chat_history聊天记录持久化groups_tbl群聊信息group_members群成员关系离线消息机制当接收方不在线时消息存入messages表用户上线后自动推送。// 发送方不在线时存储离线消息if(recv_idx0){db_store_offline_msg(msg-sender,msg-receiver,msg-content);}// 用户上线时推送离线消息staticvoidsend_offline_messages(intfd,constchar*username){Message*msgsdb_get_offline_msgs(username,count);for(i0;icount;i){send(fd,msgs[i],sizeof(Message),0);}}功能特性用户管理注册、登录验证、密码校验、重复登录检测私聊点对点实时消息传输群发消息向所有在线用户广播群聊管理创建群聊、邀请成员、踢出成员、退出群聊、解散群聊离线消息用户不在线时自动存储上线后推送聊天记录所有消息持久化存储支持历史查询在线状态实时显示用户上下线状态编译与运行环境要求Linux操作系统Ubuntu 20.04 / Fedora 35GCC 9.0MySQL 8.0GTK 2.0 开发库安装依赖Ubuntu/Debian:sudoapt-getinstallgccmakelibgtk2.0-dev libmysqlclient-dev mysql-serverFedora/RHEL:sudodnfinstallgccmakegtk2-devel mysql-devel mysql-server编译运行# 1. 初始化数据库sudosystemctl start mysqlmakedb# 2. 编译makeall# 3. 运行开两个终端./chat_server# 终端1启动服务器./chat_client# 终端2启动客户端运行效果客户端GTK界面包含登录/注册窗口输入用户名密码进行身份验证聊天主窗口左侧用户列表和群聊列表右侧消息显示区和输入框群聊管理创建群聊、邀请/踢出成员、退出/解散群聊的对话框关键代码片段消息转发私聊staticvoidhandle_chat(intfd,Message*msg){intrecv_idxfind_user_by_name(msg-receiver);if(recv_idx0){// 在线直接转发send(online_users[recv_idx].sockfd,msg,sizeof(Message),0);}else{// 离线存储到数据库db_store_offline_msg(msg-sender,msg-receiver,msg-content);}}群聊消息广播staticvoidhandle_group_chat(intfd,Message*msg){GroupInfo*groupfind_group(msg-receiver);// 转发给所有群成员除了发送者for(i0;igroup-member_count;i){intidxfind_user_by_name(group-members[i]);if(idx0online_users[idx].sockfd!fd){send(online_users[idx].sockfd,msg,sizeof(Message),0);}}}仓库地址GitHub: https://github.com/NiMark886/linux-chat-systemGitee: https://gitee.com/NiMark886/linux-chat-system总结本项目实现了一个功能完整的Linux网络聊天系统涵盖了Socket网络编程、多路复用I/O、MySQL数据库操作、GTK图形界面开发、多线程编程等Linux课程核心知识点。通过这个项目可以深入理解C/S架构的设计原理和Linux系统编程的实践技巧。如果对你有帮助欢迎 Star 支持