C语言聊天室项目说明书

网络聊天室项目说明

  • 项目的目的和意义

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

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

 

  • 项目的需求分析

1.聊天室支持连接多个客户端,采用select模型

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

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

4.显示所以在线好友

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

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

7.发送表情,常用语句

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

 

 

  • 项目的技术方案设计
  1. 服务器socket和select

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

 

  1. 客户端的实现

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

 

  1. 账号注册登录

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

 

  1. 私聊群聊

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

 

  1. 管理员功能

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

 

  1. 发送表情,常用语

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

 

  1. 保存聊天记录

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

 

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

1.重复登录的问题

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

 

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

 

  1. 退出时出现的问题

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

 

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

 

  1. MaxFd的改变问题

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

 

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

 

  1. 功能选择输入时输入出错的问题

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

 

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

 

  • 5
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Linux C语言聊天室是一种基于Linux操作系统和C语言编写的网络聊天工具,它可以实现多人在线聊天、私聊、文件传输等功能。通过使用socket编程和多线程技术,可以实现客户端和服务器之间的通信和数据传输。该聊天室可以应用于各种场景,如企业内部通讯、在线教育、社交娱乐等。 ### 回答2: Linux C语言聊天室是一个典型的客户端/服务器模型应用程序,它在Linux操作系统上使用C语言编写。该聊天室程序能够实现多个用户之间的文本通信和文件传输,具有实时性和可靠性的特点。 在实现聊天室程序时,首先需要考虑的是服务器端的搭建。服务器端主要负责接收用户的连接请求,创建相应的线程或子进程来处理连接请求,然后分配IP地址和端口号等网络信息给连接的客户端。服务器端还需要维护用户连接状态和用户消息记录,对不同的客户端之间的通信进行转发和管理。 客户端主要负责向服务器端发送连接请求,获取服务器端分配的网络信息,然后与服务器端进行通信,发送和接收文本消息以及传输文件等,实现与其他客户端的实时通信。 在实现聊天室程序时,需要使用一些Linux的系统调用和网络编程API,如socket、bind、listen、accept、connect、select等,使用多线程或多进程的方式来处理连接请求,实现多个客户端之间的通信和管理。同时需要考虑程序的安全性和稳定性,比如对用户的输入进行检查、处理异常情况的处理等。 总之,Linux C语言聊天室是一项复杂而有挑战性的任务,需要深入掌握Linux操作系统的知识和底层编程技术,具备较强的编程能力和实践经验,才能开发出高质量、可靠性高、效率高的聊天室程序。 ### 回答3: Linux C语言聊天室是一个基于Linux系统的网络应用,它通过使用C语言编程实现客户端与服务端之间的即时通信,实现两端实时聊天的功能。它是一种特殊的网络应用,因为客户端和服务端之间的通信是实时的,并且需要处理大量的数据和连接请求。 在实现Linux C语言聊天室时,需要考虑多个因素,例如通信方式、数据格式、协议等等。对于通信方式,可以选择TCP或UDP协议,其中TCP协议是基于连接的,提供可靠的传输服务,而UDP协议是无连接的,提供不可靠的传输服务。在选择TCP或UDP协议时,需要根据具体的需求和应用场景进行选择。 对于数据格式,需要定义规范的数据包结构,以便客户端和服务端之间正确地识别和解析数据。数据包结构通常包括数据长度、指令类型、数据内容等字段,对于不同类型的数据需要定义不同的指令类型。在数据传输时,需要对数据进行压缩和加密解密等操作,以保证数据的安全性和可靠性。 在协议方面,需要定义通信协议和数据传输协议。通信协议是指客户端和服务端之间的通信规范,可以采用自己定义的协议或者使用已有的协议。数据传输协议是指客户端和服务端之间传递数据的协议,比如HTTP、FTP等。 最后,Linux C语言聊天室需要考虑的一个重要因素是安全性。在实现聊天室时需要防范各种安全攻击,比如SQL注入、缓冲区溢出等。此外,还需要对聊天记录进行安全管理,以保证用户的隐私和数据安全。 总之,实现Linux C语言聊天室是一个复杂的过程,需要考虑多个因素并进行适当的技术选型和开发实现。只有在合理设计和严格实现的基础上,才能保证聊天室的稳定性、安全性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值