基于Linux的多用户聊天室
作者:Cabin_V
本篇文章是我大三下学期嵌入式系统设计课程中的期末大作业,时限是两个星期。刚开始拿到这个题目的时候都愣住了,觉得时间太少(当时还有其他课程的大作业)难度偏高而且在此之前接触到的知识较少。所以在网上搜索大量文章,其中SQList具体看的这个老哥,socket具体看的是这位老哥,再根据自己的需求,配合部分代码完成以下文章。(可能还引用了一些老哥的文章但可能我记不得了,如果有此类情况发生请立即联系我,我立马做出相应处理!第一次写文章,多多包涵!)
本文主要讲述了如何在Linux操作系统下,构建一个基于多线程模式的多用户聊天室,其中包括设计思路、流程、部分代码以及实验结果展示。基于多线程模式的多用户聊天室,使用SQLite3作为进程间的通讯手段,能够实现多机连接、多机通讯以及一些聊天软件所具备有的一些简单的功能比如私聊群聊、查看在线人数、传输文件、下线等操作。在目前使用情况来看该程序较稳定,但文件传输功能偶尔存在客户端闪退现象。
1 数据库SQList
1.1 SQLite的优点
从2000年5月29日开始,SQLite就选择了C语言。直到今天,C语言也是实现SQLite软件库的最佳语言。C语言是实现SQLite最好的语言的原因包括:性能、兼容性、低依赖性、稳定性。
性能 像SQLite这样被密集使用的基础库需要有很好的性能。C语言很适合写这样有性能要求的程序。C语言有时被称为“便携式汇编语言”,让开发者尽可能的接近底层硬件编码,同时保证跨平台的便携性。虽然也有其他汇编语言能和C语言的速度旗鼓相当,但却没有能和C一样通用。
兼容性 目前几乎所有的系统都可以调用由C语言编写的库。比如,用Java编写的Android应用能通过adapter来使用SQLite,如果SQLite是用Java编写的,这对于Andriod会更方便。但是在IOS上应用是Objective-C或者Swift编写的,这两种语言都没有办法调用Java库。因此,如果SQLite选择用Java编写,还是存在一定的局限。
低依赖性 用C原因来编写库不会在运行时有太多的依赖。在最小的配置下,SQLite只需要C标准库里的:mencmp()、mencpy()、menmove()、memset()、strcmp()、strlen()、strncmp(),在更复杂的配置下,如文件传输,SQLite还可能用到malloc(),free()和一些操作系统接口来打开、读取、写入和关闭文件。但即使这样,依赖的数量也非常小。
稳定性 这里说的稳定性是指语言的稳定性。C语言虽然比较老旧,但却很适合开发像SQLite这样更注重长期稳定的模块。
1.2 SQLite的程序中的应用
SQLite还提供了很多很方便的C语言API函数接口,本程序中包含sqlite*数据库,sqlite3_open()、sqlite3_exec()函数。其中sqlite3_open()为打开或创建数据库函数,sqlite3_exec()是执行sql语句函数。以下展示部分应用:
Server.c中main()中部分代码
ret = sqlite3_open("chat.db",&db); //建数据库
if(ret != SQLITE_OK)
{
printf("数据库打开失败!");
}
sqlite3_exec(db,"create table account(username text primary key,password text,offline_msg text);",NULL,NULL,&errmsg);//建注册信息表
2 通讯方式Socket
2.1 网络中进程之间的通讯方式
网络中进程之间的通讯是通过TCP/IP协议来唯一标识一个进程,网络层的“IP地址”可以唯一标识网络中的主机,而传输层的**“协议+端口”**可以唯一标识主机中的应用程序。这样利用三元组(IP地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其他进程进行交互。
M