1、 一、 摘要即时通信,由于具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用。设计并实现一个能够处理多用户进行实时,安全的即时通信系统具有较强的现实意义。本文设计并实现了在 linux 环境里基于局域网内的简单即时通信系统,系统采用 C/S 模式,底层通信通过 socket 套接字接口实现,能进行简单实时通信并能实现文件的传输。关键字:即时通信 TCP/UDP Linux 文件传输二、 需求分析局域网仿 qq 通信系统能实现即时通信,并且通讯采用 TCP/UDP 协议。Socket 是基于 TCP/IP 协议之上的一个接口规范,它为应用层之间的通信提供了保障。Socket 适用于客户/
2、服务器模式的网络应用程序设计,在使用面向连接模式时,使用 TCP 协议作为通信协议,为应用程序提供面向连接的服务。用 Socket 进行网络通信时,需要在客户端和服务器端分别创建一个Socket,服务器端创建成功以后在特定的端口上监听客户端的连接请求。如果有客户端的连接请求到来,则成功建立一个连接后,客户端和服务器端就可以互相进行通信了。但只能是和客户端进行点对点的通信,即服务器只允许有一个客户端的连接,如果有连接请求到达时,服务器端需要再创建一个新的Socket 与客户端进行通信,而原来的那个 Socket 仍处于监听状态,等待新的客户的连接请求。三、 概要设计程序必须建立一个 Socket
3、,按照要求配置此 Socket,也就是说程序要么将此 Socket 连接到远方的主机上,要么给此 Socket 指定一个本地协议端口。程序必须按要求通过此 Socket 发送和接收数据,程序必须关闭此 Socket。客户端:创建客户端套接字(CREATE) ;开始数据传输(SEND、RECEIVE) ;课程设计1关闭套接字(CLOSESOCKET ) ;服务器端:创建服务器端套接字(CREATE) ;服务器端套接字进行信息绑定(BIND) ,并开始监听连接(LISTEN) ;接受来自客户端的连接请求(ACCEPT) ,并创建接收进程;开始数据传输(SEND、RECEIVE) ;关闭套接字(CL
4、OSESOCKET ) 。四、 详细设计下面是实现 TCP 通信和 UDP 通信的流程TCP 通信程序的逻辑框图课程设计2S e r v e r 端 :C l i e n t 端 :S = s o c k e t ( )B i n d ( s , ( s t r u c t s o c k a d d r f a r * ) printf(“tt|= n“);printf(“tt| 欢迎进入系统 n“);课程设计4printf(“tt|= n“);printf(“tt| 1.UDP 通信 n“);printf(“tt| 2.TCP 通信 n“);printf(“tt| 3.文件传输 n“);p
5、rintf(“tt| 4.exit n“);printf(“tt|=n“);void *recver(void* data)int fd1; /文件描述符struct sockaddr_in addr1;struct sockaddr_in addr_send1; /发送者地址对象socklen_t len1; /socket_t 类型的变量 lenint r1; /结果char buf1200;/1.socketfd1=socket(AF_INET,SOCK_DGRAM,0); /*AF 是网络传输,so是udp 报文传输,0 是自动比配*/if (fd1=-1) printf(“socke
6、t err:%mn“),exit(-1);printf(“A socket okn“);/2.bindaddr1.sin_family=AF_INET; /全大写模式的是宏状态addr1.sin_port=htons(9999);inet_aton(“127.0.0.1“,r1=bind(fd1,(struct sockaddr*)if(r1=-1) printf(“A bind err:%mn“),exit(-1);printf(“A bind okn“); /3.recvwhile(1)len1=sizeof(addr_send1);r1=recvfrom(fd1,buf1,sizeof(
7、buf1)-1,0,(struct sockaddr*) /*从 fd 里取值给 buf,接收从接收者送来到信息放到 len 来*/if(r10)buf1r1=0;printf(“收到来自 IP=%s,PORT=%hu 的信息,内容如下:n%sn“,inet_ntoa(addr_send1.sin_addr),课程设计5ntohs(addr_send1.sin_port),buf1); /ntoa 网络字节序转化为网络字符串if(r1=0) /对方关闭printf(“关闭n“);break;if(r10)printf(“收到数据:%sn“,buf);if(r=0)printf(“链接断开n“)
8、;break;if(r0)printf(“!发送成功!n“),sleep(2); /发送进程休息 3 秒 等待接收进程显示收到的数据if(r=0)printf(“链接断开n“);break;if(r0) break;r3=send(sfd3, /发送截取文件到长度if(r3=-1) break;r3=send(sfd3,buf3,size,0); /发送截取文件到内容if(r3=-1) break;size=0;r3=send(sfd3,close(ffd3);close(sfd3);break;case(4):exit(0);default:printf(“errorn“);return 0
9、;执行结果如下课程设计12六、 总结课程设计13Xxx:通过三周的课程设计我掌握了许多以前没有接触过的内容,同时也掌握了许多有用的知识。这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。Xxx:本学期的最后时间里我们进行了为期 9 天的仿 qq 通信系统的课程设计,在此期间我和队友们一起互相学习、讨论,终于圆满完成此次课程设计。首先指导老师很幽默,讲课方法独特,很有吸引力,让我们不会感觉到累和困。起初指导老师让我们先回顾一些简单的小程序算是唤起我们的
10、记忆,他会让我们自己动手去写,不给我们代码,这样可以锻炼我们,同时也可以克服依赖的坏习惯。后来老师就讲解通讯系统该怎么去编写。户端,服务器端,线程,进程,TCP、UDP、SOCKET 等一些名词老师都详细讲解。期间我们遇到很多难以修改的错误,要么请求老师指导,要么百度,大家都一一解答出来了,九天时间天天对着电脑应该很累,很疲惫,但是我们都坚持下来,认真学习。最后真心地感谢老师和学校给我们提供了平台让我们把理论和实践相结合,各位指导老师你们辛苦了。Xxx:回顾起此次课程设计,至今我仍感慨颇多,的确,从从拿到题目到完成整个编程,从理论到实践,在大约两个学期的日子里,可以学到很多很多的的东西,同时不
11、仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。在设计的过程中遇到问题,可以说得是困难重重,由于c/c+都很久没有复习了,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,特别是结构体,通过这次课程设计之后,一定把以前所学过的知识重新温故。Xxx:课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人
12、与处世。课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程 ”千里之行始于足下” ,通过这次课程设计,我深深体会到这句千古名言的真正含义我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在在这次设计过程中, ,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。在此感谢我们的老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次设计的每个实验细节和每个数据,都离不开老师您的细心指导。而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。