网络聊天室项目说明

项目的目的和意义
该聊天室项目为利用linux下C语言网络编程相关知识,采用Server/Client,即服务器与客户端的基本框架实现。整个项目涉及了socket套接字,线程,嵌入式数据库sqlite3,select模型等多个知识模块,服务器整体采用select模型,并不断监听客户端,客户端中起一个线程,用来实时接受服务器发送的信息。

该聊天室项目可模拟当今的聊天工具中的各个功能,实现最基本的互相发送信息,群发消息,登陆注册等功能。完成该项目可很大的提高我们初学者的编程能力,以及面对出现的各种bug的应对解决能力,是一个提升自我的很好途径。

项目的需求分析
1.聊天室支持连接多个客户端,采用select模型

2.客户端与服务器的连接,接受信息

3.账号网名的注册,登录,并存档

4.显示所以在线好友

5.服务器与客户端的通信,实现信息转发(私聊,群聊)

6.实现管理员权限,可进行禁言,踢人等功能

7.发送表情,常用语句

8.每个用户都建立各自的聊天记录文件,服务器保存所以用户的聊天记录

项目的技术方案设计
服务器socket和select
首先建立socket,用bind进行绑定后,用listen进行对客户端的监听。在一个while(1)循环中,采用select对客户端进行操作,将所以文件描述符放到readfd中,如果是有新的客户端要进行连接,即sockfd有动静,就开始accept操作,将新的fd放到readfd中,并修改maxfd的值;如果是其他已经存在的fd有动作,则进行聊天室相关的功能操作。

客户端的实现
先建立socket,用connect与服务器进行连接,此后先进入账号登陆注册的函数,登陆成功后,及账号函数执行完毕,此时起一个线程,用来实时接受服务器端发送的信息。之后调用聊天室的各种功能的实现函数。在线程中,不断接受服务器发送的信息,根据标志位实现各个功能,如私聊位是1,就进行打印收到的信息内容。

账号注册登录
这是需要打开一个数据库,用来存放帐号密码网名的信息。注册时,要进行判断该账号是否已经存在,将其与账号数据库中的账号进行逐一比较,若存在相同的则将一个标志位置一,显示该帐号已存在,在输入网名时进行同样的查重操作。登陆时,输入账号时判断该帐号是否已经登录,以及是否存在,输入密码后与数据库相应位置的信息比较,判断密码的对错。当登陆成功后,将登陆的id,网名信息发送给服务器,服务器形成一个链表,用来存放在线用户的信息,包含网名所对应的文件描述符fd,以便后期使用,登录时输入账号查看是否在已经在线就是向服务器发送一个信号,在服务器端遍历该链表,查看是否在线,再发送回客户端。

私聊群聊
在客户端处选择该功能,输入发送对象的网名,然后就可以输入信息并发送。定义一个用来专门发送信息的struct,Sendbuf,设置私聊的标志位,私聊时将其置一,服务器端判断该位如果是一就进行私聊操作,将网名和发送的内容分别存放到Sendbuf中,服务器接收到后,根据网名来遍历在线用户链表,查找到相应的fd,再将信息转发给该用户,若是群聊,就将信息转发给链表中的所以用户。

管理员功能
在每个客户端设置一个管理员标志位,初始化为0,若选择注册会员功能,则将其置一,否在在选择禁言踢人等功能时显示无权限。禁言时输入禁言对象,服务器转发禁言消息给该用户,该用户的不可发言标志位置一,则不能进行私聊群聊。踢人时输入网名,服务器向其发送退出信号,则该客户端退出聊天室,及进程被终止。

发送表情,常用语
设置特有的标识符代表相应表情和常用语句,之后进行私聊操作,发送相应的表情和常用语。

保存聊天记录
在客户端的私聊群聊发送表情常用语功能处,发送之后将其内容和发送者发送对象的网名存放到相应用户的数据库表中,在接受端同样进行该操作,即可保存用户的聊天记录。在服务器端,进行转发操作时,将发送者发送对象网名和聊天内容存放到系统的聊天记录文件中,便实现了服务器端的聊天记录保存。

四、遇到的问题与解决途径及方法

1.重复登录的问题

问题:由于每个id登陆后,在接受消息发送消息时,都会打开用其id命名的数据库表,如果同时登录了一个账号,在接受发送消息时,两个进程会同时打开一个数据库表,这时就会exec函数就会出错,进程退出。

解决方法:这时就需要限制帐号的重复登录,保证一个账号只能登录一次,在登陆的时候,将输入的id号发送给服务器,遍历服务器中在线用户信息的链表,若已存在则打印该帐号已登录。这样就可以保证每个帐号只能登陆一次。

退出时出现的问题
问题:在一个客户端退出时,如果没有相应的操作,在服务器端该客户端的相关信息还是存在的,在其他用户聊天查看好友时会出现问题,并且此时若有其他客户端连接,所产生的fd也会出错,所以在退出时一定要有相关操作。程序异常退出时,如遇到ctrl+c信号,也应有相应操作。

解决方法:遇到ctrl+c信号时,客户端应获取该信号,即SIGINT,获取后执行一个函数,用来关闭相应的fd,并在服务器端删除该用户的在线信息。在功能选择界面也添加一个退出选项,执行相关操作。

MaxFd的改变问题
问题:在同时连接了几个客户端后,通讯都正常,但是关闭中间的客户端时,会出现之后开启的客户端无法与服务器通信的现象。

解决方法:在调试了多次之后,发现问题出在MaxFd的改变上,MaxFd必须要比select中的那个readfd中的最大的成员的fd的数值要大,如果小了,就会出线上述问题,造成之后的fd无法通信。在每次有客户端退出时,一定要将fd数组中的所以fd遍历一遍,找到最大的再赋值给MaxFd,一定要确保MaxFd足够大才可以。

功能选择输入时输入出错的问题
问题:由于各个功能的选择标号是int型,正常应该输入一个数字,但如果随便输入各种字符的话就会出错,并且由于缓冲区的问题,会继续影响之后的功能选择

解决方法:分两步,scanf这个函数也是有返回值的,如果没有获取成功会返回0,可以通过这个来判断是否获取到了int型数据,如果失败了,就需要进行清除缓冲区,查找了资料,可以用while((ch = getchar()) != EOF && ch != ‘\n’);来进行清除缓冲区。

网络聊天室项目说明书相关推荐

  1. 仿微信的网络聊天室项目开发【完整源码讲解】

    目录 总体开发思路 服务器端 服务器界面设计 建立TCP服务器端通信 建立服务器消息发送输出流 建立服务器消息接收输入流 建立服务器实时消息通信线程 设置服务器通信自由断开 客户端 客户端界面设计 建 ...

  2. C语言聊天室项目说明书

    网络聊天室项目说明 项目的目的和意义 该聊天室项目为利用linux下C语言网络编程相关知识,采用Server/Client,即服务器与客户端的基本框架实现.整个项目涉及了socket套接字,线程,嵌入 ...

  3. 仿微信的网络聊天室项目开发【完整源码讲解,Java一年工作经验面试题

    /*使滚动条置于文本框最下端*/ infoWindow.setSelectionStart(infoWindow.getText().length());JScrollBar jSBInfo = jS ...

  4. QQ版网络聊天室完整项目+MFC\C++\C(更改服务器IP可实现异机沟通)

    QQ版网络聊天室完整项目+MFC\C++\C 资源地址1 资源地址2 项目简介 服务器端部分代码 客户端响应部分代码 数据库连接 理论~ 实例展示 资源地址1 https://github.com/M ...

  5. 网络编程项目(聊天室项目)

    一.实现目标 一个在Linux下可以使用的聊天软件,要求至少实现如下功能: 1. 采用Client/Server架构 2. Client A 登陆聊天服务器前,需要注册自己的ID和密码 3. 注册成功 ...

  6. java_OA管理系统(一):Servlet总结案例仿网络聊天室

    因为我们学校的软件联盟要为我们校区开发一个OA系统,为此我将其所需要的一些技术进行汇总,以便web组组员开发所用. 第一篇是关于Servlet的一个汇总案例,算是开个简单的小头. 一.总述 代码来源于 ...

  7. 网络聊天室的技术与发展

    网络聊天室的技术与发展 摘要: 此文讲述了视频聊天网站相关的技术.发展过程.从客户那里了解到了很多的视频聊天相关的需求,经过自己长时间对视频聊天网站运营模式.盈利模式.系统架构以及相关技术的研究,写下 ...

  8. Linux环境下——C语言聊天室项目

    由于使用了多线程操作,客户端进入程序后请先随便注册一次用户后再进行使用. 本程序默认第一个用户即ID为1的用户为超级管理员. 由于线程阻塞,最后的踢人操作有阻塞,需要在被踢出在线链表后手动下线. 看了 ...

  9. java大作业网络聊天室

    这个项目是我大一的java期末大作业,学习了一个学期的成果,编程能力不够,做的并不够好,写在这里记录一下自己的成长,也欢迎大家给出宝贵意见! 第一次写博客哟,请多多支持! 该篇博客写一个基于java的 ...

  10. windows网络编程 ---网络聊天室(1)

    文章目录 一个简单的网络聊天室 服务器端 代码 客户端 代码 一个简单的网络聊天室 运行如下: 只是实现了一个简单的通信功能,下一节我们再来讨论的IO/CP模型 服务器端 初始化网络环境 int WS ...

最新文章

  1. Node-RESTful
  2. CSS position属性absolute relative等五个值的解释
  3. Spring注解编程基石(四)
  4. linux 安装python-opencv
  5. 赵雅智_Swift(2)_swift常量和变量
  6. java速学堂_Java 实例 - 状态监测
  7. jsp之servlet模板问题
  8. 十七、创建一个 WEB 服务器(一)
  9. python网络编程百度云_python网络编程.mobi
  10. android ui 资源下载,【51CTO推荐】Android UI设计相关下载资源
  11. 构建KEGG pathway、Entrez ID、Ensemble ID的对应关系
  12. 2022年施工员-土建方向-岗位技能(施工员)考题模拟考试平台操作
  13. 进入ubuntu进入系统时忘记密码了怎么办
  14. 笔记本电脑没有声音如何解决
  15. matlab 画卫星轨道,Matlab仿真实例-卫星轨迹
  16. 美素将进入中国空间站,以太空科技打造“国货之光”
  17. .NET网站本机调试通过、发布后EXCEL导入数据库报错问题的解决
  18. 软件中间件,你知道哪些?
  19. Linux C/C++ 设置混杂模式的三种方法
  20. Win10右键清空剪贴板

热门文章

  1. 猕猴桃的红色果肉受到特定的激活-抑制系统的控制
  2. 企业版IDP的申请及“In House”发布
  3. 玛雅日历和2012年12月,whats的新政
  4. Linux的sh脚本编写基础知识
  5. html5 spice 虚拟桌面,开源桌面虚拟化spice体验
  6. 安装linux系统四个企鹅,red hat linux as4下安装小企鹅输入法(fcitx)_转
  7. 一堂难忘的计算机课作文,难忘的信息课作文
  8. 如何测试网页的登录页面(转载)
  9. Taylor Swift为何听不到搜不到她的歌曲了?让我告诉你个好法子
  10. 如何在BaseFragment中直接调用BaseActivity中相关属性代码的问题