通信软件实训 文档.docx
《通信软件实训 文档.docx》由会员分享,可在线阅读,更多相关《通信软件实训 文档.docx(19页珍藏版)》请在冰点文库上搜索。
通信软件实训文档
北京邮电大学软件学院
2010-2011学年第1学期实训项目文档
(每个项目小组一份)
课程名称:
全日制研究生实训
项目名称:
通信软件实训
项目完成人:
指导教师:
程保中,雷友珣,谢锦,陆天波,孙艺
日期:
2012年3月2日
●JAVA语言的聊天室实现
一、实训项目的目的和要求:
目的:
理解Socket的原理,熟悉JAIN-SIP协议规定的通信工程
要求:
实现一个有GUI界面的JAVA聊天室系统
二、实训项目开发环境:
Eclipse、Windows
三、实训项目内容:
1、设计思路
客户端:
以服务方主机地址和端口号为参数调用Socket类的构造函数去创建一个Socket对象.创建过程包含了向服务方请求建立通讯连接
使用Socket对象的getInputStream()和getOutputStream()方法创建用于网络传输的输入/输出流
使用所得的网络流对象读写数据,网络流对象将读写转换成对Socket数据的接收和发送
工作完毕,关闭网络流对象
服务器端:
以某端口号为参数调用ServerSocket类的构造函数去创建一个ServerSocket对象
调用被创建的ServerSocket对象的accept()方法在指定端口监听客户方的连接请求
收到客户请求后,accept()方法返回一个新建的Socket对象,该对象代表和客户方建立起来的通讯连接在服务方的通讯端点
使用Socket对象的getInputStream()和getOutputStream()方法创建用于网络传输的输入/输出流
使用所得的网络流对象读写数据,网络流对象将读写转换成对Socket的数据的接收和发送
工作完毕,关闭网络流对象
2、系统总体框架
系统的主要功能:
本系统由登陆界面、服务器界面和客户端界面三部分组成,服务器端可以控制打开或关闭端口和服务,并且可以监视在线用户数量。
用户则在登录界面输入相应的验证信息才能登录要系统,从而通过客户端进行聊天,发送的消息将通过服务器广播给所有在线用户,达到群聊的目的。
3、用例介绍及用例图
※用例名称:
登陆
主要参与者:
客户端用户
涉众及其关注点:
用户希望能顺利登陆系统并进行交流
服务器端希望能对用户进行验证并返回验证信息
前置条件:
用户必须通过验证
成功保证:
服务器根据用户提供的信息进行验证并通过
主成功场景:
用户向服务器发送验证信息
服务器对信息进行验证
向用户返回验证结果
成功登陆到服务器
※用例名称:
聊天
主要参与者:
客户端用户
涉众及其关注点:
用户希望能顺利进行聊天,并且保护隐私
服务器要保证聊天的顺利进行
前置条件:
用户已经登陆系统
成功保证:
两个或更多用户登陆服务器
主成功场景:
用户A发送信息
服务器接收到信息
服务器将信息转发给用户B
用户B进行回复
服务器收到信息并转发给用户A
※用例名称:
启动服务器
主要参与者:
服务器
涉众及其关注点:
服务器希望能正确启动,各个模块能正常运行
前置条件:
服务器程序是正确的
成功保证:
服务器端的硬件支持
主成功场景:
按下服务器启动按钮
服务器程序开始运行
程序成功运行,进入服务状态
用例图如下:
4、领域模型
5、顺序图:
启动服务器顺序图
登陆顺序图
聊天顺序图
6、
类图
四、程序开发成果
先打开服务器端程序,输入端口号,运行之后打开客户端,输入服务器端的IP地址和端口号,连接成功后可开始进行对话。
聊天窗口如下:
五、总结
通过本次实训项目的练习,我们充分理解了Socket的原理以及SIP协议,并对SIP在JAVA中的实现方法——JAIN-SIP作为API来调用有了一个比较全面的认识。
对JAVA可视化界面的处理能力也有了很大提高。
JAVA是一门面向对象的语言,通过对它的研究,加强了对面向对象语言中类和对象的使用。
●C语言Socket聊天室实现
一、实训项目的目的和要求:
目的:
通过socket实现Linux环境下的点对点通信。
要求:
掌握Linux环境下socket编程的基本过程;掌握c语言的socket套接字的编程思想
二、实训项目开发环境:
Linux
三、实训项目内容
1、问题分析:
如何通过socket实现Linux环境下的点对点通信。
2、设计思路:
网络套接字(Socket)接口上TCP/IP网络应用程序接口(API),它提供了许多函数和例程,程序员可以使用它们来开发TCP/IP网络应用程序。
简要步骤如下:
(1)建立一个Socket.
(2)按要求配置socket,将socket连接到远程主机或给socket指定以各本地协议端口。
(3)按要求通过socket发送和接受数据。
(4)关闭此socket。
在客户/服务器模型中,多个相互通信的计算机都作为客户端,与网络服务器进行连接,并通过服务器进行信息的传递。
所以多个客户端之间的通信就变为了客户端与服务端的通信。
所以,采用客户/服务器模型进行网络聊天需要分别编写服务器端和客户端的程序,服务器和客户端之间相互通信的同步关系和各自的程序流程。
如图所示:
3、实验过程及说明(使用TCP/IP):
(1)监听连接
利用socket、bind、listen建立连接,步骤是:
1)用socket函数初始化socket,创建新的sockfd。
Sockfd=socket(AF_INT,SOCK_STREAM,0)
2)IP地址的处理
参数说明:
inet_addr函数INADDR_ANY
该函数把由小数点分开的十进制IP地址转为unsingedlong类型,而在实验中所使用的为INADDR_ANY,使用利用自己的IP地址自动填充。
a)利用bind函数绑定端口和IP地址。
My_addr.sin_family=AF_INET;/*将地址族类型设定好*/
My_addr.sin_port=htons(MYPORT;/*将端口给其赋值*/
My_addr.sin_addr.s_addr=INADDR_ANY;/*用连接地址自动填充ip*/
Bind(sockfd,(stuctsockaddr*)&my_addr,sizeof(stuctsockaddr));
/*sockfd是分配的socket名字,my-addr则便是分配好的端口与IP,用bind绑定*/
b)利用listen监听请求
(2)发送请求
1)利用gethostbyname获取主机信息。
2)初始化socket端口。
3)利用connect函数将自己的IP地址等信息发送到主机,等待主机调用accept函数来接受请求。
(3)主机接收请求,进行数据通信
1)主机利用accept接收请求。
2)创建子进程,显示欢迎信息;
3)接收返回信息,显示连接成功,并推出连接;
4)关闭客户端口socket;
5)关闭服务端socket,结束子线程。
4、实验项目结果及分析
结果分析:
该测试是在一台计算机上进行的,若要实现两台计算机间的点对点通信,只需修改相应的IP地址和端口号即可。
如图所示,该系统实现了P2P通信,即通信双方之间可以相互发送和接收消息,达到了预期目的,满足了老师的要求和用户的需求。
四、总结
Linux环境对于我们都是一个陌生的环境,通过这次对Linux环境下的socket编程以实现双工通信,使我们小组成员c语言编程能力有了提高和对Linux和对Linux的gcc编译环境有了进一步的认识。
使我们在宏观上认识了Linux,相信对我们以后学习Linux会有很大的帮助。
●基于O-SIP的Socket聊天室开发
一、实训项目的目的和要求:
目的:
完成一个基于控制台的聊天室,最基本要实现群聊和私聊内容;
要求:
掌握o-sip实现sip协议;
二、实训项目开发环境:
Windows、VC++2010
三、实训项目内容
1、问题分析:
项目实现的是一个基于sip的简单聊天程序,要求用c/c++实现,可以应用exsip库,以及接口进行程序开发,要求聊天室实现基本的群聊和私聊功能,在此基础上可以进行进一步扩展,可以为提示哪个客户上线,哪个客户下线,客户端可以向服务器请求获得在线用户列表,操作简单易懂,系统要有一定的稳定性,并有一定的可扩展性。
2、设计思路:
(1)总体设计
项目采用exosip接口进行设计,为了开发聊天室选择可以实现相应功能的接口,开发出来的聊天程序要实有高的效率可以及时转发客户端的发送的消息,要有一定的可靠性和灵活性,实现基本功能的基础上要有一定的扩展性。
(2)数据存储
要选出正确的数据结构能够存储用于通讯的数据。
(3)功能性判断
功能性需求要区别于其他消息,为了区分可以功能性需求和普通消息的区别可以设置一些格式。
(4)功能实现
为了实现群聊服务器端可以把客户端发来的普通消息进行广播给在聊天室的所有用户,实现私聊的时候服务器要把这条消息只发给指定客户端,不可以使其他人看到,如果客户端需要查看在线用户信息服务器要把信息发送给请求的客户端。
3、基本的流程设计
(1)服务器设计流程图:
(2)客户端流程:
4、功能实现
基本的群聊和私聊功能都是通过服务器转发到的,当服务器接收到群聊的信息就可以进行广播,但接到私聊的信息就只发给接收方。
在客户端在接收数据采用一个接收线程定义是,staticHANDLEhHandle1=NULL;定义一个句柄DWORDWINAPIrec_v(LPVOIDp)用来定义一个线程,当需要进行调用时在相应的位置写上hHandle1=CreateThread(NULL,0,rec_v,NULL,0,NULL)。
发送数据时采用while循环并且在发送数据是要判断是否是功能性请求消息,例如如果输入的是***cls那么这是求求清屏,那么客户端就不把这条消息发个服务器,并自身处理这个功能。
在服务器端不采用多线程,应为服务器子进行转发或者提供功能性需求,不需要自己输入什么,所以在一个while循环就可以实现基本功能了,并且在接收消息是要判断是否是功能性请求,如果是者进行功能性处理,比如当客户端发送***list时,服务器要把在线用户信息发给提出请求的客户端。
5、设计流程图
(1)服务器端流程图:
服务器首先进行初始化工作然后等待客户端对他的连接并接受客户端发来的消息,如果接收到的数据是功能性请求则进行功能性处理,否则当作普通消息进行广播,判别是否是功能性请求的方法是客户端再发送功能性请求时在信息的头部加上***及请求类型,比如***list就是一个申请用户列表的请求,当服务器端接到***就解析后面的命令,当时sip:
时表明这是一个新用户,然后服务器会在自己维持的用户列表中把新用户加进来,然后继续等待接收客户端信息,当收到list时会把在新用户信息发给起初请求的用户,当私聊时服务器会把这条信息转发个指定用户,而不去转发,这些操作结束后程序都会回到接收数据的状态。
(2)客户端流程图:
首先客户端完成基本的初始化过程,输入自己的名字和端口号程序会自动把输入转化成sip:
name@ip:
portde形式去连接服务器,连接成功开启接收线程后不断监听是否有消息发送过来,当接收到消息后打印然后继续监听,当输入的消息不是功能性请求这个消息不做任何处理发给服务器,输入的消息是功能性请求消息时,会有两种处理一种是客户端可以自己处理的,这样客户端自己处理后继续等待键盘输入,比如清屏功能,当需要服务器协作完成时客户端会把消息进行加工然后发给服务器等待服务器合作处理,比如当向服务器请求显示在线用户是发给服务器的消息会在前面加上***list,这样当服务器接收到消息时解析***知道这是一个功能请求,然后再解析出list知道这是一个在线用户列表请求,然后在线用户列表发给请求的用户。
当收到的功能性请求是退出或者私聊等处理过程和上面类似。
四、实训项目结果及分析
我们的O-SIP的聊天室系统的开发主要是基于控制台,由于开发时间比较仓促,所以我们仅仅实现了简单的消息收发的双工通信,界面还未实现美化等。
希望老师谅解。
服务端启动之后创建一个socket,将socket和本机的IP绑定
五、实训项目人员、进度安排及完整过程
六、实训项目心得及体会
项目基本实现了需求的功能,程序可以进行基本的私聊和群聊,在此基础上还可以进行在线用户查询,提醒所有用户是否有人上线或者下线,并且系统相对稳定,有一定的扩展性,通过此次实训学到了很多知识对网络编程有了一定的了解和深入,在实践编程中虽然遇到了很多问题但是通过组内和组件交流,都得到了很好的解决,多练了自己和别人的交流能力和团队精神,总之有很多的收获,并希望有机会能够多参与到这样的实训中。
通过这三周的实训,我们小组各个成员都在软件工程方面有所提高。
一开始构想时只有大体的思路,忽略了一些细节,因此在我真正做设计时发现有很多错误,有的时候要解决一个错误会花上很多时间,在做的过程中,有很多错误意想不到,有的错误却犯得很幼稚,不过这样对自身的排错能力能得到很大的提高。
比如一个组员在做javasocket聊天程序测试时候,他无论怎么运行都会出现错误,而且出现提示信息他也无法修改,浪费了他至少两个小时时间,最后因为在定义类的时候是小写,而在直接生成的类他把删去,又直接复制编程人员的程序。
这些细小错误让我深受感慨,它告诉了我编程细心重要,养成一个好的编程习惯更重要。
这次项目的完整开发,让我们有项目初步的思想,这次项目的开发让我把软件生成的流程从信息的收集,再写需求,再完成后台设计到编写代码,到测试,让我知道还有很多地方的不足。
更重要的是团队之间的合作,相互之间的交流,有时一个问题总是想不通,但每个队友负责的部分不同,所以想法也不同,交流之后,便有了新的思路。
这次课程设计的时间很紧迫,再加上各方面的经验不足,也遇到很多问题,这个聊天系统还有很多地方没有完善,希望老师能谅解。
总的来说,这次课程设计对我很有帮助,我发觉老师上课讲的很多东西对我们都很有用,让我受到不少的启发。
感谢程保中教授,雷友询教授这三周来对我们的细心教导和使我们的通信软件知识有了很大的提高和其感谢孙艺,谢锦,陆天波三位老师在这三周内每天都陪我们在实验室,为我们解除疑惑,帮我们分析错误。
正是由于你们才使我们在自信心上有了大的增强,不再感觉做项目是个遥不可及和非常困难的事情。
这次工程实践的为我们有条理的梳理了我们所学的软件工程方法和编码技术。
使我们在以后的工作中敢于面对困难和向困难挑战。