思路:
网络聊天室
架构:C/S 架构(服务器和客户端架构)还有B/S架构,网页通信。
至少两个文件:client.c server.c

第一步:实现连接:客户端与服务器
网络通信(TCP/IP协议):(网络通信在这个项目中只用到了网络通信的底层架构:代码基本不变)
socket套接字连接,分两块
server.c :socket函数(用于创建套接字)
bind函数:绑定本地的接口和ip地址
listen函数:监听函数,监听端口套接字
accept函数:进行客户端的连接(阻塞型函数)
client.c:socket函数
bind函数
connect函数(尝试连接)
两者可以建立连接

第二步:进行登陆注册的操作
先进行客户端的操作,登录注册操作(这里客户注册的信息要放在数据库中,数据库是在服务器端,也就是说需要将用户注册的id,name等信息通过网络传给服务器,放在服务器的数据库中,在客户进行登录操作时,需要与服务器建立连接,查找数据库实现登录操作)这里要用到read 和write函数 ,客户端要给服务器发送消息。用write函数
write(cfd,s,strlen()) ccfd:(套接口)文件描述符 s:发送的消息的字符串指针 strlen():发送消息的长度。这里需要发送不止一个信息,有昵称,密码,账号等,不能连续写几个write或者read,这样连续发,连续读,可能会出现连包的现象(后面数据发送快,连上前面的消息,导致消息错误,所以 wirte和read函数发一次读一次,不可以出现连续发,连续读)

第三步:操作服务器
用的是大并发服务器,就是一个服务器可以同时和多个客户端连接。
accept函数每连接一个客户端就会执行一个客户端,这里要使用线程,就是在accept函数连接一个客户端之后,创建一个线程(pthread_create(pid,NULL,NULL,cfd))第三个参数可以是回调函数,就是说一个客户端就是一个线程。accept函数是阻塞型函数,当连接完一个客户端后,accept函数就阻塞在那里,等待下一个客户端来连接,然后再进行线程的创建。这样就实现了多用户同时登录的效果。
当一个用户登录之后,服务器在数据库中进行比对,如果在服务器中找到对应的用户,那么就可以给客户端返回一个标志位,这里我们要注意,客户端与服务器之间传递的是结构体,结构体里面存放的都是相关信息,当程序执行到这里需要在结构体里添加一个标志位,将这个标志位通过结构体传递给客户端,客户端接收之后,根据这个标志位来判断,是否登陆成功。登录成功就进入聊天界面,如果失败则返回登录界面。

第四步:
进入聊天界面,这里就可以选择性的去执行各项功能,scanf输入,但是要注意scanf 是阻塞型函数,每次执行完会阻塞在那里,这时如果有人给我发消息我是接收不到的,因为scanf阻塞在那里了,这里就要用到读写分离了,一个只给服务器写,另一个只读服务器。

以上网络通信+并发服务器客户端架构完成。

私聊:是通过链表来实现,每次私聊就去检索这个链表,每个结点会有,客户端的套接字文件描述符。
群聊:遍历链表
私聊群聊可以设置标志位,来判断。

管理员:可以用flag来实现是管理员登录还是普通用户登录。
踢人:就是将用户与服务器断开连接强制下线。
禁言:可以设置标志位,给用户禁言
聊天记录保存:就是用数据库来存,多一张表。
文件传输:因为read和write都是数据流不是文件,所以文件传送是需要打开文件,再读取数据,发送数据,接收数据,创建文件,写入数据。

线程池:提高服务器的安全性,节省资源。
心跳检测:查看长时间不操作,看看客户端是否还连接