基于Linux的消息队列及多线程编程实现的聊天室(一)

该博客介绍了如何利用Linux IPC中的消息队列和多线程技术实现一个聊天室应用。主要内容包括消息队列的基本原理、用户登录、私聊、群聊、查看在线用户等功能。代码分析和下载链接也已提供。
摘要由CSDN通过智能技术生成

本程序主要是针对Linux IPC通信初学者对Linux下消息队列通信机制,多线程编程,字符串处理,链表操作,信号简单处理等基本概念的练习。

原理:

  消息队列是System V支持一种IPC机制,通过类似链表的操作向一个FIFO里通过msgsnd发送用户自定义数据,进程可以通过msgrcv来接收指定类似mtype的数据,从而实现进程间通信。

 

主要实现了以下功能:

 

  1. > 通过多个终端登录,不同终端上登录用户实现私聊
  2. > 群聊
  3. > 查看在线用户
  4. > 简单注册(没有实现用户保存,类似于公共聊天室)

下面是几种操作的处理流程分析。详细代码分析见下篇博文:

          http://blog.csdn.net/mr_raptor/article/details/8484822

代码下载:

          http://download.csdn.net/detail/mr_raptor/4976808

 

 >> 服务器通过特定的类型mtype:1000,从消息队列上接收数据。

 >> 当前登录用户将随机产生(random())的一个随机ID号作为申请用户ID,使用如下协议向服务器(mtype=1000)发送申请消息。

@msg.h

协议数据定义如下,共有4个段,以“:”作为分隔符。

 

// CMD:FROM:TIME:DATA 
#define     DATA_LEN    4
#define     OFT_CMD     0
#define     OFT_FRM     1
#define     OFT_TIM     2
#define     OFT_DAT     3
#define     DATA_TOK    ":"

 

CMD:FROM:TIME:DATA

项目简介: 采用I/O复用技术select实现socket通信,采用多线程负责每个客户操作处理,完成Linux下的多客户聊天室! OS:Ubuntu 15.04 IDE:vim gcc make DB:Sqlite 3 Time:2015-12-09 ~ 2012-12-21 项目功能架构: 1. 采用client/server结构; 2. 给出客户操作主界面(注册、登录、帮助和退出)、登录后主界面(查看在线列表、私聊、群聊、查看聊天记录、退出); 3. 多客户可同时连接服务器进行自己操作; ##服务器端## 1. server.c:服务器端主程序代码文件; 2. config.h:服务器端配置文件(包含需要的头文件、常量、数据结构及函数声明); 3. config.c:服务器端公共函数的实现文件; 4. list.c:链表实现文件,用于维护在线用户链表的添加、更新、删除操作; 5. register.c:服务器端实现用户注册; 6. login.c:服务器端实现用户登录; 7. chat.c:服务器端实现用户的聊天互动操作; 8. Makefile:服务器端make文件,控制台执行make命令可直接生成可执行文件server ##客户端## 1. client.c:客户端主程序代码文件; 2. config.h:客户端配置文件(包含需要的头文件、常量、数据结构及函数声明); 3. config.c:客户端公共函数的实现文件; 4. register.c:客户端实现用户注册; 5. login.c:客户端实现用户登录; 6. chat.c:客户端实现用户的聊天互动操作; 7. Makefile:客户端make文件,控制台执行make命令可直接生成可执行文件client;
Linux环境下实现一个多线程聊天室,通常会涉及到socket编程、线程管理和消息队列等技术。以下是一个简化的步骤概述: 1. **服务器端**: - 创建套接字(socket),监听特定的端口。 - 使用`listen()`函数设置套接字为监听模式。 - 通过`accept()`创建新的连接,并为每个客户端启动一个新的线程处理请求。 ```c #include <sys/socket.h> ... int server_socket, client_socket; struct sockaddr_in server_addr, client_addr; ... void* thread_handler(void* arg) { // 在这里处理新连接,读取客户端消息并发送回客户端 } ``` 2. **线程处理**: - 每个新进来的客户端连接都会对应一个新线程,每个线程负责读取数据、解析消息、加入到消息队列,然后调度其他线程向所有在线用户广播。 3. **消息队列**: - 可能会使用`pthread_joinable_queue`或者其他线程安全的数据结构,存储待发送的消息,确保消息按顺序传递给各个客户端。 4. **消息发送**: - 定期循环检查消息队列,如果有新的消息,就从队列取出并发送到相应的客户端。 5. **客户端连接和断开**: - 客户端也需要建立一个连接,发送用户名或其他标识信息,并接收来自服务器的消息。 6. **错误处理**: - 确保捕获并处理可能出现的网络错误、内存泄漏等异常情况。 这只是一个基础的框架,实际的代码会更复杂,需要考虑并发控制、异常处理以及性能优化等问题。如果你对特定语言如C/C++有需求,我可以给出一个简化版的基本代码片段,但完整的实现还需要根据实际需求进行调整。下面是一个简单的server部分示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <pthread.h> typedef struct ThreadData { int client_sock; } ThreadData; void* chat_thread(void* data) { ThreadData* td = (ThreadData*)data; char buffer[1024]; // ... 读取、处理消息逻辑 ... } int main() { int server_sock, port; ... // 设置服务器地址和端口 ... listen(server_sock, 5); while(1) { ThreadData td; td.client_sock = accept(server_sock, NULL, NULL); pthread_create(&thread_id, NULL, chat_thread, &td); } return 0; } ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值