基于c语言的局域网聊天系统的设计与实现论文内容摘要:

包含的范围很广泛,共有 34 种运算符。 C 语言把括号、赋值、强制类型转换等都作为运算符处理。 从而使 C 语言的运算类型极其丰富,表达式类型多样化。 灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。 (3)数据类型丰富。 C 语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。 能用来实现各种 复杂的数据结构的运算。 并引入了指针概念,使程序效率更高。 (4)表达方式灵活。 C 语言提供多种运算符和表达式值的方法,对问题的表达可通过多种途径获得,其程序设计更主动、灵活。 它语法限制不太严格,程序设计自由度大,如对整型量与字符型数据及逻辑型数据可以通用等。 (5)允许直接访问物理地址,对硬件进行操作。 C 语言由于 C 语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位( bit)、字节和地址进行操作,而这三者是计算机最基本的工作 单元,可用来写系统软件 (6)可移植性。 C 语言在不同机器上的 C 编译程序,大部分的代码是公共的,所以 C 语言的编译程序便于移植。 在一个环境上用 C 语言编写的程序,不改动或稍加改动,就可移植到另一个完全不同的环境中运行。 职场大变样社区( ):下载毕业设计成品 9 4 系统需求分析及设计 问题描述及可行性分析 局域网聊天软件,基于安全性与使用性的角度设计,能够满足实际的聊天业务需求。 能够实现系统所需的功能,减少公司因为交流困难或者不安全所带来的问题和利益损失。 可行性的时机 :目前,虽然网络已经成为人们生活中 不可或缺的一部分,但是,随着互联网的发展,网络安全也成为人们日渐关心的话题,这个问题在大型企业尤为重视,所以,基于互联网的强大的安全性受到大型公司的推崇,而基于互联网的聊天系统也同样受到好评,他不仅方便,更重要的是安全性强,外部人员无法获取到内部局域网的交流信息,所以这个系统还是有它自己独特的优点的,它的开发是需求可行的。 需求分析 在可行性分析阶段,我充分的研究了基于局域网的聊天软件的市场需求,分析了市场上确实存在这一方面的需求,因此设计了这一款软件,除此之外,我还借鉴了市场上比较热门的多款软件的 内容,比如 ,微信等,在此基础上思考自己软件的内容,与技术可行性,综合自己的实力欲实现一下几个内容 : (1)启动服务器:必须先启动服务器才可以进行用户的注册、登陆、和聊天功能。 (2)用户登录:用户如果有自己的用户名和密码可以通过用户名和密码直接进行登陆,如果并没有这些,需要先进行注册才能登陆,登陆之后的用户会在服务器上显示用户想要登陆时,发送请求到服务器,通过后即可登陆,等待服务器的登录认证。 服务器获得的用户名和密码,以进行验证。 如果用户名和密码不正确,则服务器提醒用户输入错误的密码。 如果用户名和密码是 否正确,登录成功。 (3)用户离线:当用户想要离线时,直接关闭窗口即可。 如果在登陆时想选择退出,可按照提示操作。 (4)注册用户:用户想进入局域网聊天系统,你必须注册一个用户名。 需要填写用职场大变样社区( ):下载毕业设计成品 10 户名和密码,密码需要重复 2 次, 2 次都对的情况下才能注册成功,之后可以选择时候登陆,选择登陆。 (5)发送聊天消息:进入聊天界面之后,用户可以选择聊天方式,有两种聊天方式可供选择,选择群聊就是自己的发送的信息登陆的用户都可以看到,选择私聊,发送的信息只有接受的那个人能看到。 图 41 所示为用户用例图 图 41 用户用例图 本章小结 在本章主要对聊天软件的需求进行了分析,需要实现的功能主要有用户的登陆,注册,退出,群聊,私聊等功能。 职场大变样社区( ):下载毕业设计成品 11 5 系统概要设计 服务器端概要设计 这个聊天工具是使用 C / S 架构设计。 服务器启动之后才可以启动客户端的服务,服务器端要处理的功能主要由以下几个。 服务器端所提供的主要功能及协议 1 处理用户注册请求 2 处理用户登录请求 3 处理用户下线请求 4 处理保持连接请求 5 显示以上现用户信息 客户端概要设计 客户端需要实现的功能: 1用户登录界面实现。 2用户注册界面实现。 3用户聊天界面实现。 4群聊功能的实现。 5私聊功能的实现。 职场大变样社区( ):下载毕业设计成品 12 图 51 程序流程图 模块组织 整个聊天软件主要包括的模块有:用户注册模块、用户登录模块、用户退出模块、聊天模块。 其中聊天模块包括群聊模块和私聊模块。 模块组织如图 所示。 模块关系图如 所示。 图 52 聊天软件模块组织图 职场大变样社区( ):下载毕业设计成品 13 图 53 各模块间调用关系 各个模块实现原理 1服务器模块 首先搭建好服务器 , 搭 建服务器需要五个步骤 : 1. 创建 socket 套接字。 2. 填写地址结构体 (包括 IP,port) 3. Socket 套接字与地址结构体进行绑定。 4. 进行客户端的监听 ( listen)。 5. 用 accept()接受客户端发来的数据。 搭建好服务器之后 , 只要服务器接收到来自客户端发来的数据 ,就会分离出一个线程进行处理。 服务器根据客户端发来的结构体所携带的协议来选择相应的功能。 2注册模块的实现 如果协议为 reg,则为客户端注册,服务器接收发来的结构体,提取用户名和密码,然后需要对用户名进行合法性检验,验证之后,如果用户名不为空且与 之前注册的用户名不重复,就将这个用户名和密码写入 文件中。 3登陆模块的实现 如果协议为 log,则为客户端登陆,客户端通过 logname 和 passwd 将用户名和密码发送给服务器,服务器收到之后通过协议进行解析用户名和密码,判断用户名和密码是否符合规范,用 if 语句判断,在 文件中查找该用户名,如果不存在提示该用户名不存在,如果存在,密码不正确,提示该用户名密码不正确,反之登陆成功。 登职场大变样社区( ):下载毕业设计成品 14 陆成功之后,将 fd 加到顺序表中。 4群聊模块的实现 在服务器进行协议的判断 , 如果是 who 协议而不是 chat 协议 , 那么这个是群聊 ,需要调用客户端群聊的代码进行判断。 服务器将得到的信息收到之后进行解析 , 加上时间戳之后用循环的方式发送给顺序表中的每一位用户。 5私聊模块的实现 客户端用 @用户名 @: 的形式发送服务器 , 服务器进行解析 , 服务器根据 who 协议和 chat 协议判断他为私聊模式 ,经过操作获取到要发送的用户名,加上时间戳之后发送给该用户。 6 详细设计及代码实现 在本章主要对之前概要设计中的内容进行完善和代码的编写 , 主要编写的代码包括职场大变样社区( ):下载毕业设计成品 15 服务器端的代码 , 以及登陆 注册 , 群聊私聊的代码 , 群聊的功能是聊天室内的一个人发言 , 聊天室内的所有人都可以收到 , 私聊是聊天室的一个人对特定的另一个人说话 , 只有指定的那个人才可以收到。 服务器的设计与启动 在启动客户端之前,必须先启动服务器,启动服务器有 5 个重要步骤,在下面的代码中有详细列出,在 5 个步骤执行完毕之后,一旦服务器监听到客户端的请求,就会给客户端分配一个线程,和一个端口号让其运行。 include include int sockfd。 Fd_Vector *v。 struct Regmsg{ //用户信息结构体 int num。 char name[10]。 char passwd[15]。 }。 char* fdname[30]。 //使用一个指针数组 ,存储 fd 和对应的 name int Regmsgwrite(const char* name, const char* passwd)。 //在本地文件处理注册信息 ,返回值 : 1:成功 ,0:失败 ,1:用户名重复 int Logmsgwrite(const char* name, const char* passwd)。 //登录 ,检查对应用户名密码 ,返回值 :1:成功 ,0:失败 ,1:未注册用户 ,2:用户存在 ,密码不匹配 void out_fd(int)。 //根据 fd 输出 对应 ip 和 port void serverDisplay()。 //服务器主界面 void bindfdname(int fd, char* name)。 //将 name 写入对应 fd 中 职场大变样社区( ):下载毕业设计成品 16 void deletefdname(int fd)。 //将下标为 fd,name 删除 int findfdname(char* name)。 //根据 name 返回对应 fd void sys_error(const char* name, int err) { fprintf(stderr, %s: %s\n, name, strerror(err))。 exit(1)。 } //根据 fd 输出 对应 ip 和 port void out_fd(int fd) { char ip[16] = {0}。 struct sockaddr_in addr。 socklen_t size = sizeof(addr)。 if(getpeername(fd, (struct sockaddr*)amp。 addr, amp。 size) 0) sys_error(getpeername, errno)。 unsigned short port = ntohs()。 i_ntop(AF_INET, amp。 (), ip, sizeof(ip))。 printf(ip: %s, port: %d\n, ip, port)。 } void display() //遍历顺序表 . { int i。 for(i = 0。 i v count。 i++) { printf(fd:%d , vfds[i])。 out_fd(vfds[i])。 } } void bindfdname(int fd, char* name) { 职场大变样社区( ):下载毕业设计成品 17 fdname[fd] = name。 } void deletefdname(int fd) { fdname[fd] =。 } int findfdname(char* name) { int i。 for(i = 0。 i 30。 i++){ if(!strcmp(fdname[i], name)) return i。 } } void* do_service(void* arg) //使用这个线程进行 ,登录注册业务 ,如果登录成功 ,则添加 fd 到顺序表中 { long fd = (long)*((int *)arg)。 char buff[1024]。 int len。 char name[10]。 char passwd[15]。 while(1) { memset(buff, 0, sizeof(buff))。 len = read(fd, buff, sizeof(buff))。 if(len 0){ sys_error(read, errno)。 close(fd)。 delete_fd_v(v, fd)。 职场大变样社区( ):下载毕业设计成品 18 deletefdname(fd)。 return (void*) 0。 }else if(len == 0){ close(fd)。 delete_fd_v(v, fd)。 deletefdname(fd)。 break。 } else { if(strstr(buff, Reg) != NULL) //收到注册信息 ,分离出 name,passwd { char swapname[20]。 char* swappasswd = strstr(buff, Passwd)。 int size = strlen(swappasswd)。 strcpy(passwd, swappasswd+8)。 strncpy(swapname, buff, (strlen(buff)。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。