版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
攀枝花学院本科毕业设计(论文)Linux下的网络聊天工具的设计和实现学生姓名:XXXXXXX学生学号:XXXXXXXXXXXX院(系):数学与计算机学院年级专业:09级信息与计算科学指导教师:XXXXX硕士助教二零一三年六月需求分析2。1功能需求该聊天工具是在linux平台下进行开发与实现的,它适合于局域网内所有人进行通信和交流。由于这个系统采用了tcp/ip协议和socket接口,所以主框架采用c/s架构。从总体来讲,该聊天系统主要包含服务端和客户端。服务端功能实现模块:保存新用户注册的相关信息(主要是用户名和密码)验证登录用户的信息接收和转发用户聊天信息功能(接收发信用户发来的信息,再将信息转发到收信用户)系统查看在线用户以及剔除指定用户客户端功能实现模块:选择操作模式(注册或者登陆)输入指令进行相应的功能(私聊,群聊,发送文件)客户端接收服务端的信息,然后通过消息队列发送到display端,让display终端显示出信息内容客户端彼此发送文件时,对文件的内容进行加密处理前面是服务端和客户端单独运行模块,下面是服务端和客户端共同完成通信:客户端向服务端发送服务请求,验证用户信息服务端验证完后向客户端发送响应信息发信客户端向服务端发送指令信息,请求相应操作服务端转发信息到收信客户端2。2性能需求(1)高效性和可靠性:在一个pc机上一个服务端和多个客户端同时开启,对pc机cpu性能要求有点高,所以设计的程序应该最大限度的提高系能,减少系统的没有必要的消耗。如果在操作不当,或者由于系统原因,比如端口被占用等,要使程序能够尽量安全的退出.(2)程序模块兼容性好:对于程序的主框架需要添加各种功能来完善,这必然就会产生模块和主框架之间的融合性,所以在编写程序时,因注意对函数和变量的规范。(3)最后程序应该使每个人都容易理解,并且很容易进行操作。2.3模块划分系统结构图如下:主模块主模块私聊聊天记私聊聊天记录文件DES加密群聊注册登录传输文件传输文件图2。1聊天模块划分图2。4模块调用关系模块在整体框架中的位置如下图:未注册用户入口未注册用户入口已注册用户入口已注册用户入口登录登录文件传输私聊文件加密群聊文件传输私聊文件加密群聊聊天信息保存聊天信息保存图2.2模块位置关系图2.5系统总流程图Socket编程几乎是采用的C/S模式,该模式是基于局域网内进行通信的基础架构,它可以使用任何的通信协议,并且在通信的过程中能充分发挥客户端的处理能力,使客户端响应速度加快。所以,该系统总体采用C/S模式.开始开始打开服务端,处于监听状态客户端登陆是否注册注册否是是客户端之间进行交流私聊群聊发送文件是否加密解密接收正确数据接收错误数据信息保存文件关闭交流关闭客户端关闭服务端否 图2.3系统总流程图2。6文件信息安全每天网络中都要进行大量的数据传输,如果对于这些数据的保密措施没有做好,那么将对个人及企业带来很大的麻烦,因此信息安全问题也越来越受到人们的关注,人们希望自己在网络上传输的信息不能被别人查看,特别是一些具有重要资料的文件内容。信息的安全关系到人们的利益,所以对文件的内容进行保护是十分重要的.而对文件内容保护的关键技术就是将文件内容在网络传输中进行加密,然后解密。这次对数据的加密,采用的是DES加密算法.DES算法是一种对称算法,采用的是分组数据加密技术,该算法速度快,且能对大量数据进行加密。其DES在设计中的大概原理是,当发送文件客户端发送文件时,先将文件的数据进行加密,然后通过socket套接字发送到接收端,接收端接收到文件,将接收到的文件加密数据进行解密,如果加密密钥和解密密钥完全相同,接收端就能接收发送过来的正确数据,否则就是错误数据.当然这里只是局域网内简单的文件数据加密,在现实生活中各种加密遍布生活的每一个角落,比如现在很热点的无线和无线云等都需要各种加密措施保护数据传输。基于这种趋势,加密算法在以后的网络发展中的地位将会一步步的提升.3linux网络编程3.1socket概念及功能(1)概念:我们把socket直接翻译过来的意思就是插座,听起来挺古怪的,但是它的作用就类似于这个插座的作用。作为了解socket的人都有另一种喊法:套接字。它包含有IPhttp:///view/23880。htm"主机大多数情况都会有很多应用程序,每种应用程序对应着一个服务相当与就是客户端。每种服务都打开一个Socket,并把服务端和客户端指定绑定到系统中的同一个端口上,而且这个端口必须相同且不能为系统所占用的端口。进程之间的通信需要端点这样的标志,socket就提供了这种标志。所以不同进程之间要通过socket提供的端点才能使进程之间相关联起来进行数据传输.服务端和客户端的数据通信,我们可以这样理解,就是把客户端套接字里面的内容传输到服务端套接字里面去,两个套接字建立一种关联,该关联应该包含多个元素用来建立多个Socket,使多个客户端与指定的ip和端口号建立联系。这里值得一提的是,socket是面向客户/HYPERLINK”/view/899.htm"服务器模型而设计的面对不同客户端和服务端系统调用。Socket实际上是网络传输层和应用层之间的桥梁.客户向内核任意请求一个socket,系统会立刻为之分配一个socket号,/view/930.htm"客户端发送请求,连接成功并通信。详细的过程为首先服务端调用socket函数创建一个套接字,然后把协议,端口号,ip信息通过bind函数进行绑定.以上操作完后服务端就开始监听客户端的请求,并设置监听的最大数目。当客户端发送链接请求时,服务端就调用accept函数接受客户端的请求.然后对于客户端来说,也是要先调用socket函数创建客户端的套接字,这里是用的tcp协议,所以可以不用bind函数。接着调用connect函数与服务端建立连接。当服务端和客户端建立连接时,可以通过彼此之间的套接字描述符来进行数据传输。其中一方通过send函数把数据写入数据缓冲区,有TCP层负责写向网络层进行传输,另一方通过recv函数从缓冲区内读出数据,这样就完成了服务端与客户端之间的数据传输。当双方数据传输完成后,由函数close关闭各自的套接字,使客户端和服务端通信中断.具体流程图如下:Socket()创建套接字Socket()创建套接字Socket()创建套接字Socket()创建套接字Bind()配置本地端口和ipBind()配置本地端口和ipListen()监听和接收请求Accpet()接收请求和建立连接Connect()与服务器连接Recv()h和send()接收和发送信息Send()和recv()发送和接收信息Close()关闭套接字Close()关闭套接字 客户端图3.1socket流程图3。4TCP/IP协议3。4.1OSI概述1、OSI功能描述:我们清楚的了解到OSI并不是一个网络结构,因为它没有定义每个层拥有的具体服务和协议,它只告诉我们每一层该做什么样的工作.但是ISO为所有层提供了标准,每个标准都有自己内部的标准协议。由于OSI参考模型过于复杂,现在流行的因特网体系已经不再使用OSI的表示层和会话层,但是这里还是需要介绍一下OSI模型及其七层层次结构。OSI即开放式通信系统互联参考模型(OpenSystemInterconnection,OSI/RM,OpenSystemsInterconnectionReferenceModel),是all",3)==0) return—1;/*打开文件user。txt,向文件写入用户注册信息*/fd=open("user.txt”,O_RDWR|O_CREAT|O_APPEND,0666))〈0); do {if((read_size=read(fd,&cmpmsg,sizeof(cmpmsg)))〈0) }while(read_size==sizeof(structmessage));//读出文件内容,检验文件是否有相同注册信息write_size=write(fd,recievemsg,sizeof(structmessage)//向文件写入注册信息}5.1.2登录实现同样服务端接收到客户端的login指令,然后进入intlogin(structmessage*recievemsg)函数,该函数主要有一下操作:intlogin(structmessage*recievemsg){ if((fd=open("user.txt”,O_RDONLY))〈0)//打开注册信息文件 do {if((strcmp(recievemsg—〉name,)==0)&&(strcmp(recievemsg—〉msg,cmpmsg。msg)==0))//如果用户名和密码是对的怎成功返回 { close(fd); return0; }}while(read_size〉0);//循环读取文件的注册信息}通过登录检测成功后,服务端用insertendlist(clientlink,clientNode)将用户登录信息保存在聊表中。5。2私聊和群聊5。2.1私聊客户端通过who:message的方式来发送私聊消息,服务端在voidhandleclient(clientinf*client)函数中通过链表查找是否有who这个用户,如果有服务端则根据的who的套接字把message转发出去。voidhandleclient(clientinf*client){ 。。。。。。while(1){ ..。.。。else{ LinkListL; L=clientlink; L=L—>next; strcpy(,clientN); while(L!=NULL)//查找链表中的用户名是否和who相同 { if(strcmp(L->,mess。flag)==0)//查找成功 { /*向who用户转发信息*/send(L—〉data。decr,&mess,sizeof(structmessage),0); break; } L=L—>next; } continue; }}5。2.2群聊群聊是以all:message的方式发送信息的,和私聊的主要区别就是,这里要将链表的所有用户查找出来并且转发信息。elseif(strcmp(mess.flag,"all")==0){if(strcmp(mess.msg,"”)!=0){ LinkListL; L=clientlink; L=L—〉next; strcpy(,clientN);//将链表里的用户名封装在数据结构里 while(L!=NULL)//向链表的所有用户发送信息 {send(L-〉data。decr,&mess,sizeof(structmessage),0); L=L—〉next; }}continue;5。3文件传输和DES加密(1)文件传输的原理就是一个读写文件的操作过程,即从文件读出内容放在一个数据缓存区里面,然后通过网络传输,接收端再从数据缓存区内把内容读出,并把内容写入一个新文件里面。文件的传输是通过trans:who:filename形式传输的,服务端接收到传输文件客户端的信息,解析出指令和接收端名字,然后给接收端发送信息,有人发来文件是否接收,接收端回发trans:agree,服务端就给发送端发送对方接收文件的信息,接收端就开始传输文件.voidhandlesendfile(void){ do{ 。。 /*判断文件是否传输完毕*/if(paper。size==0) { strcpy(paper。msg,"end$"); } elseif(paper.size〉0)//文件正在传输中 { send(sockfd,&paper,sizeof(structmessage),0); } else { printf("papersendfailed!!\n”); break; } }while(paper。size>0);}voidhandlerecvmsg(int*sockfd){ .。。。.. elseif(strncmp(client_msg.flag,"trans”,5)==0) { pthread_tpid; if(strcnmp(client_msg,"agree”,5)==0)//对方同意接收文件 { strcpy(filefromname,client_); pthread_create(&pid,NULL,(void*)handlesendfile,NULL);// 创建一个线程来发送文件 } /*不同意接受对方发过来的文件*/elseif(strncmp(client_msg.msg,”disagree”,8)==0) { printf("Theotherrefusedtoacceptdocuments\n”); close(savefilefd); savefilefd=-1; } elseif(strncmp(recvmsg.msg,"noexist”,8)==0) { printf(”Theclientdoesnotexist\n”); close(savefilefd); savefilefd=-1; } /*向接收端发送信息,是否接收文件*/else { strcpy(filefromname,client_); printf(”%sxiangniqingqiumingwei%swenjian,shifoutongyijieshou?\n",,recvmsg。msg); savefilefd=0; } continue; } }(2)DES加密就是文件传输之前对文件的数据进行加密,然后接收端就收到加密数据在进行解密。intdes_main_ks(uint32SK[32],uint8key[8]){ GET_UINT32(X,key,0);GET_UINT32(Y,key,4);/*密钥置换1*/T=((Y>〉4)^X)&0x0F0F0F0F;X^=T;Y^=(T〈<4);T=((Y)^X)&0x10101010;X^=T;Y^=(T);/*异或处理*/X=(LHs[(X)&0xF]〈〈3)|(LHs[(X〉〉8)&0xF]〈〈2)|(LHs[(X>〉16)&0xF]<〈1)|(LHs[(X>>24)&0xF])|(LHs[(X〉>5)&0xF]<<7)|(LHs[(X〉>13)&0xF]〈<6)|(LHs[(X〉〉21)&0xF]<<5)|(LHs[(X>〉29)&0xF]〈<4);Y=(RHs[(Y〉〉1)&0xF]<<3)|(RHs[(Y〉>9)&0xF]<<2)|(RHs[(Y〉>17)&0xF]〈<1)|(RHs[(Y〉>25)&0xF])|(RHs[(Y>>4)&0xF]〈<7)|(RHs[(Y〉〉12)&0xF]〈〈6)|(RHs[(Y>〉20)&0xF]〈<5)|(RHs[(Y〉〉28)&0xF]〈〈4);X&=0x0FFFFFFF;Y&=0x0FFFFFFF;/*循环左移*/for(i=0;i〈16;i++){ if(i<2||i==8||i==15){ X=((X〈〈1)|(X>〉27))&0x0FFFFFFF;Y=((Y〈<1)|(Y>>27))&0x0FFFFFFF;}else{ X=((X<〈2)|(X>>26))&0x0FFFFFFF;Y=((Y<<2)|(Y〉>26))&0x0FFFFFFF;}#defineDES_IP(X,Y)//Ip置换处理{T=((X>>4)^Y)&0x0F0F0F0F;Y^=T;X^=(T<〈4);T=((X〉〉16)^Y)&0x0000FFFF;Y^=T;X^=(T〈〈16);T=((Y〉>2)^X)&0x33333333;X^=T;Y^=(T<<2);T=((Y〉>8)^X)&0x00FF00FF;X^=T;Y^=(T〈〈8);Y=((Y〈<1)|(Y〉〉31))&0xFFFFFFFF;T=(X^Y)&0xAAAAAAAA;Y^=T;X^=T;X=((X<〈1)|(X>〉31))&0xFFFFFFFF;}#defineDES_FP(X,Y)//ip逆置换处理{X=((X〈〈31)|(X〉>1))&0xFFFFFFFF;T=(X^Y)&0xAAAAAAAA;X^=T;Y^=T;Y=((Y〈<31)|(Y>>1))&0xFFFFFFFF;T=((Y〉〉8)^X)&0x00FF00FF;X^=T;Y^=(T〈<8);T=((Y>〉2)^X)&0x33333333;X^=T;Y^=(T〈〈2);T=((X〉〉16)^Y)&0x0000FFFF;Y^=T;X^=(T〈〈16);T=((X>〉4)^Y)&0x0F0F0F0F;Y^=T;X^=(T〈〈4);}5。4错误方案解决由于socket关闭后并不是立即收回,所以当服务端运行次数过多时,会出现Addressalreadyinuse的错误提示。解决方案:就是调用一个setsockopt函数在运行程序时选择的端口号过小,导致服务端和客户端不能连接,因为linux系统中的端口号分布为:1-1023是系统保留的端口号,1024—4999有客户端程序自由分配,5000-65535有服务端程序自由分配。解决方案:在5000-65535中任意选一个。客户端彼此发送消息的过程中,显示的消息内容出现方框形式的乱码,主要原因是数据缓冲区有一些无关的数据存在。解决方案:用memset或者bzero函数对数据缓冲区清零。编译程序时,总是出现:undefinedreferenceto`pthread_create’错误,原因是因为没有连接上pthread函数库.解决方案:在编译时加上-lpthread。程序中文件传输部分输入正确路径,但是不能到相应路径去读取文件。原因是当在屏幕输入路径时,由于是字符串,系统没有默认加上‘\0’.解决方案:比如输入”/home/linux/4。c”
存放在buff中,存放完后还需要加上buff[strlen(buff)]=‘\0’.6运行效果6.1编译操作(1)编写完服务端程序后,通过make编译生成程序server.(2)编写完客户端程序后,通过make编译生成程序client和display.(3)在主系统中输入。/server运行服务端,在克隆系统中多开几个端口输 入./client192.168。129.1298888运行客户端。(4)还需要打开一个端口运行./display,用于保存聊天记录。6.2注册和登录运行效果图(1)服务端创建好套接字,处于监听状态,当客户端发来请求时,服务端根据收到的机构体所带的信息作出相应的功能.服务端运行情况如下:图6.1服务端界面(2)客户端选择注册功能,则客户端把注册的用户名和密码封装在一个结构体中发送到服务端,服务端接收该结构体的内容信息,对其用户名和密码进行合法性检测。检测成功之后,就将用户信息保存在一个文件中。其中对于用户名和密码输入不能空,同时用户名不能注册为特殊标识符,比如:all,show,trans等。如果注册成功,则服务端会给客户端发送一个注册成功的信息,否则就是注册失败。注册结果如下图:图6.2客户端注册界面(3)客户端选择登陆功能,也是通过结构体把用户信息发送到服务端,服务端提取信息,然后遍历存放在文件里面的用户名和密码。如果在文件中找到有相同的用户名和密码,则登陆成功,否则失败.在输入用户名和密码时,用户只有三次机会,如果三次机会都没有正确输入,那么客户端就自动退出。登录结果如下图:图6.3客户端登录界面6。3私聊和群聊效果图(1)当多个客户端连接成功时,其中一个客户端想和另一个客户端端单独聊天时,可以按照who:message的方式给另一个客户端进行私聊.当客户端按照这样的方式发送信息时,服务端会分析出who,然后在链表中进行查找who,查找成后就将信息转发给who这个客户端。私聊结果如下图:图6。4客户端发送信息界面图6。5客户端回应信息界面(2)群聊功能和私聊功能类似,客户端发送的格式位all:message;服务端会解析出all指令,然后相应的进行all功能。群聊结果如下图:图6。6客户端群发信息界面图6。7客户端han接收群发信息界面图6.8客户端jhj接收信息界面6.4文件传输效果图某一个客户端想要想另一个客户端传输文件时,可以输入trans:who:filename,其中filename为路径和文件名。服务端解析出trans指令时,就去链表中查找who客户端,如果查到who客户端,就会发送某客户端向你发来一个文件是否需要接收,who客户端回复trans:agree则表示接收文件,然后开始传输,则服务端就会给发送文件端客户端发送信息告诉它对方接收文件。Who客户端接收文件前,先对该文件重新取名并放在当前路径下。文件传输结果图如下:图6。9客户端发送文件界面图6。10客户端接收文件界面6。5文件内容加密效果图首先对传输文件的数据内容进行DES加密,然后把加密的数据内容发送到接收文件端,接收端接收到加密数据然后进行解密,在加密密码和解密密码完全相同的情况下,接收端才能接收正常的数据,否则为一些乱码。比如我自己创建的文件1。txt里面的内容为:jhjjhjjhj,当DES解密密码错误,传过来的内容为乱码,如下图:图6.11加密密码不同接收的文件数据界面结束语通过本次的毕业设计对linux模拟网络聊天的设计,自己从中学习到了很多知识和经验,同时把我大学四年学的知识通过这次设计重新好好的巩固了一遍,更重要的是,通过这次毕业设计大大的增加了自己的代码量和编程能力.平时我们简单的课程设计也许就只有注重代码的成功与否,但是这次除了代码之外,还要处理文档之类的细节问题,让我提前认识到一个项目的完成最主要的是先拟出一个主框架结构图,接着就在这个主结构图中一步一步实现各种模块,最后才是代码的实现。 这次设计是在linux系统下实现的,所以通过这次设计的时间加深对linux系统认识以及其各种软件和命令的熟悉运用。设计中采用的是TCP/IP协议网络聊天,经过这段时间的设计和开发,自己对TCP/IP协议的流程和原理有了进一步的了解,知道了该协议中数据包是怎么封装发送的。同时在设计中还运用了网络编程中的socket套接字,了解了发送内容
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年商水县带编教师招聘考试备考题库及答案解析
- 2026年彭阳县带编教师招聘考试备考题库及答案解析
- 2026年巴彦县带编教师招聘考试模拟试题及答案解析
- 2026年额敏县带编教师招聘笔试参考题库及答案解析
- 2026-2027学年江苏省南通市中考数学押题试卷(含答案解析)
- 2026年元阳县带编教师招聘考试备考题库及答案解析
- 2026年色达县带编教师招聘笔试模拟试题及答案解析
- 2026年咸宁嘉鱼县人民医院急需紧缺专业人才招聘27人笔试备考题库及答案详解
- 2026年红原县带编教师招聘笔试参考题库及答案解析
- 2026年永宁县带编教师招聘考试模拟试题及答案解析
- 2026秋小学科学教科版六年级上册(新教材)教学计划附进度表
- 运用PDCA循环提高下肢深静脉血栓护理预防措施落实率课件
- 缠论公式(最完美自动画笔公式)主图
- 糖化血红蛋白检查
- 2023年广东广州南沙区万顷沙镇招聘编外人员23人笔试模拟试题及答案解析
- 语音信号处理基础课件
- 自动控制理论第四版教案(夏德钤翁贻方版)
- GB/T 9800-1988电镀锌和电镀镉层的铬酸盐转化膜
- GB/T 4604-2006滚动轴承径向游隙
- GB/T 29489-2013高压交流开关设备和控制设备的感性负载开合
- GB/T 1415-2008米制密封螺纹
评论
0/150
提交评论