技术标签: stm32 嵌入式linux学习 笔记 网络 arm开发 linux
本项目是基于 Linux 下 Socket 网络编程的局域网聊天室,实现了账号注册与登录、私聊消息、群发消息、发送离线消息、查看聊天记录、修改昵称密码等功能,并设置管 理员,实现将用户禁言、解禁、踢出聊天室等,采用多线程并发服务器模型处理多个客户端的同时连接和请求,服务器创建并管理用户数据、在线用户数据、聊天数据、离线消息数据等 SQlite 数据库,并提供后台服务,客户端通过 TCP 协议建立与服务器的稳定连接,并通过格式化输入输出实现与用户的交互,使用 Makefile 工具实现项目代码的自动化编译和链接
多线程并发服务器模型:通过使用多线程,服务器可以同时处理多个客户端的连接和请求,提高了系统的并发性能。
SQLite 数据库管理:服务器使用 SQLite 数据库来存储用户数据、在线用户数据、聊天记录和离线消息,实现了数据的持久化和高效查询
主要还是对于数据库的读写,因为程序写的有问题经常需要修改程序,还有就是会面临多个客户端同时访问一个数据库会出现冲突的问题。
编程语言:C/C++
网络编程:Socket 编程
并发模型:多线程
数据库:SQLite
编译工具:Makefile
核心思想是利用多线程技术,使得服务器能够同时处理多个客户端的连接和请求,从而提高了服务器的并发处理能力和响应速度。
当一个新的客户端连接请求到达时,服务器会创建一个新的线程来处理该连接。这个新线程会负责与该客户端进行通信,接收其发送的请求,并执行相应的操作或返回响应。同时,其他已经存在的线程则可以继续处理其他客户端的请求,互不干扰。
SQLite是一个轻量级的关系型数据库管理系统,具有零配置、自包含的特点,适用于嵌入式系统和移动应用等场景。
SQLite的轻量级、无服务器、基于文件存储等特点
指使用TCP(传输控制协议)进行网络通信的编程方式
TCP是一种可靠的、面向连接的协议
TCP是面向连接的,UDP是面向无连接的
UDP程序结构简单
TCP是面向字节流的,UDP是基于数据包的
TCP保证数据的正确性,UDP可能会数据丢失
建立连接:三次握手
客户端收到应答后,再发送一个应答报文段,其中包含ACK标志位,同时客户端发送一个随机数Z
服务器收到请求后,如果同意连接,则发送一个应答报文段,其中包含SYN和ACK(确认)标志位,同时服务器发送一个随机数Y
客户端向服务器发送连接请求报文段,其中包含SYN(同步)标志位,同时客户端发送一个随机数X
数据传输
断开连接:四次挥手
客户端收到应答后,再发送一个应答报文段,确认断开请求
服务器发送一个FIN(结束)报文段,请求断开连接
服务器收到请求后,发送一个应答报文段,确认断开请求
客户端发送一个FIN(结束)报文段,请求断开连接
TCP可靠,体现在TCP在传输数据之前,会有三次握手来建立连接,在传输数据时,有确认、窗口、重传等控制机制,在数据传输后还会断开连接用来节约系统资源
服务器
调用 socket()函数创建套接字
调用 bind()函数将套接字与一个端口号以及 IP 地址进行绑定
调用 listen()函数让服务器进程进入监听状态,监听客户端的连接请求
调用 accept()函数处理到来的连接请求
调用send()和recv()函数分别发送和接收数据
调用close()函数关闭Socket对象,释放相关资源
客户端
调用 socket()函数创建套接字
设置需要连接服务器的 IP 地址和端口
使用 connect()连接服务器
调用send()和recv()函数分别发送和接收数据
调用close()函数关闭Socket对象,释放相关资源
用户数据
name:用户名
id:用户 ID
password:密码
在线用户数据
name:用户名
cfd:用户文件描述符
flag:用户标志位
聊天数据
name:发送用户
toname:接收用户
msg:消息结构体
离线消息数据
name:发送用户
toname:接收用户
msg:消息结构体
这个其实很简单,管理员我命名为admin,只要是这个用户名登录就是进入管理员模式。
用户在注册时提供用户名和密码,程序会随机生成一个十位数的ID,将用户名,密码和ID都存储在 SQLite 数据库中。在登录时,用户输入可以选择是使用用户名登录还是密码登录,然后用户输入用户名或者ID其次输入密码,服务器验证这些凭据是否匹配数据库中的记录。
服务器初始化
创建一个服务器套接字(Socket)并绑定到指定的 IP 地址和端口。
监听连接请求,等待客户端连接。
客户端连接处理
当客户端连接时,服务器接受连接请求并创建一个新的线程来处理该客户端。
每个客户端连接都有一个独立的线程,负责与该客户端通信。
管道
普通管道:单工通信,只能父子或兄弟进程间使用
流管道:半双工通信,只能父子或兄弟进程间使用
有名管道:双工通信,并且允许没有关系的进程间使用
信号:信号用于通知接收信号的进程有某种事件发生,所以可用于进程间通信;除了用于进程间通信之外,进程还可以发送信号给进程本身
消息队列:消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺陷。
信号量:信号量是一个计数器,与其它进程间通信方式不大相同,它主要用于控制多个进程间或一个进程内的多个线程间对共享资源的访问
共享内存:共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但其它的多个进程都可以访问,使得多个进程可以访问同一块内存空间。
套接字(Socket):基于网络的 IPC 方法,允许位于同一主机或使用网络连接起来的不同主机上的应用程序之间交换数据,就是网络通信
以上是项目的介绍和面试官可能会提出来的问题,项目代码免费分享,关注我后私信我发项目代码。
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法