技术标签: 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 方法,允许位于同一主机或使用网络连接起来的不同主机上的应用程序之间交换数据,就是网络通信
以上是项目的介绍和面试官可能会提出来的问题,项目代码免费分享,关注我后私信我发项目代码。
文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr
文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc
文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8
文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束
文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求
文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname
文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立
文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码
文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词
文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限
文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定
文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland