重庆理工大学电子学院即时通信软件设计课程设计论文Word格式.docx
《重庆理工大学电子学院即时通信软件设计课程设计论文Word格式.docx》由会员分享,可在线阅读,更多相关《重庆理工大学电子学院即时通信软件设计课程设计论文Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
通过综合课程设计,使学生能够运用《数字信号处理》、《信号与系统》、《通信原理》、《面向对象的程序设计》、《计算机通信网》、《通信协议开发及应用》等课程的知识来设计一个基于Socket的即时通讯系统,培养学生的动手能力以及分析问题、解决问题的能力。
二、设计内容
利用vc++/delphi6.0为开发环境的前台开发工具,基于socket接口编程实现服务器与客户端之间的即时通信。
并能够编制友好的对话界面,有能力的还可以实现文件、图片的传输,语音的对话等等。
三、设计要求
基本要求
1、熟练掌握面向对象的程序设计方法;
2、实现点对点通讯,能进行文字对话传输,包括客户端与服务器端;
3、能对系统参数进行配置。
提高要求
1、实现文件、图片传输;
2、语音对话(两人及两人以上);
3、友好的对话界面。
四、设计原理
1:
TCP/IP简介
TCP/IP的历史要追溯到70年代中期,当时ARPA为了实现异种网之间的互连(interconnection)与互通(intercommunication),大力资助网间网技术的研究和开发,于1977年到1979年推出目前形式的TCP/IP体系结构和协议规范。
到今天,TCP/IP技术以及Internet网间网已经为广大计算机工作者。
机算机厂商和机算机用户所接受.据统计,到1990年,Internet以包含遍布欧美的五千个活动网络,超过三十万台机算机。
作为一种事实上的工标准,TCP/IP技术方兴未艾。
2:
TCP/IP的网络分层结构
对TCP/IP协议来说,TCP提供传输层服务,IP提供网络层服务。
TCP/IP协议组(或Internet协议组)的分层结构及其与OSI模型的对应关系如图4所示。
图中有关协议的名称及其基本含义如下:
(1).TCP为传输控制协议(TransmissionControlProtocol)。
它是提供给用户进程的一个可靠的全双工字节流的面向连接的协议。
大多数Internet应用程序使用TCP.因为TCP使用IP,所以整个Internet协议组也常称为TCP/IP协议组。
(2).TCP为传输控制协议(TransmissionControlProtocol)。
大多数Internet应用程序使用TCP.。
因为TCP使用IP,所以整个
(3).Internet协议组也常称为TCP/IP协议组。
(4).ICMP为网间报文控制协议(InternetControlMessageProtocol)。
(5).IP:
网间协议(InternetProtocol).IP协议时为了TCP,UDP和ICMP提供分组发送服务协议。
(6).ARP:
地址转换协议。
(7).RARP:
反向地址转换协议
3:
socket原理
Socket编程界面由4BSDUNIX首先提出,目的是解决网间网进程通信问题。
Socket接口为进程间通信提供了一种新的手段,它不但能用于同一机器中的进程之间的通信,而且支持网络通信功能。
Socket具有类型,反应了对用户透明的通信特性。
微软的WindowsSocket规范对Berkley的套接字规范进行了扩展,利用标准的Socket的方法,可以同任何平台上的Socket进行通信;
利用其扩展,可以更有效地实现在Windows平台上计算机间的通信。
在Delphi中,其底层的Socket减轻了编写计算机间通信软件的难度;
Delphi中对WindowsSocket进行了有效的封装,使得用户可以很方便地编写网络通信程序。
Socket通信在Windows中是排队的形式由操作系统处理,而且接收方和发送方相互协同工作,否则就会造成数据丢失。
因此,不能用类似于for语句的循环来实现对多组数据的放松,更不能用循环语句来接受数据。
另外,和所有的通信编程一样,Socket编程也遵循数据分包传送这一基本规则。
也就是说,在socket编程中,每次发送和接受一个包,以保证数据传输的安全性和稳定性,同时也不至于过多地占用系统资源。
Socket编程界面由4BSDUNIX首先提出,目的是解决网间网进程通信问题.Socket接口为进程间通信提供了一种新的手段,它不但能用于同一机器中的进程之间的通信,而且支持网络通信功能.Socket具有类型,反应了对用户透明的通信特性.
一个完整的Socket连接用一个相关描述:
{协议,本地地址,本地端口,远地地址,远地端口}
Socket是面向客户-服务器模型而设计的,针对客户和服务器程序提供不同的Socket系统调用.
不管Socket内部机制如何,它提供给应用程序员的最终界面是一组系统功能调用.下面,我们一一给出重要的Socket系统调用.
(1).创建Socket-----socket()
调用格式如下:
sockid=socket(af,type,protocol)
af:
地址族,指本socket所用地址类型.
type:
类型,指创建socket的应用程序所希望的通信服务器类型.
protocol:
协议,指本socket请求的协议.
(2).指定本地地址----bind()调用
bind()将本地socket地址与所创建的socket联系起来,即将本socket地址赋予socket,以指定本地半相关.bind()的作用相当于给socket命名,调用格式为:
bind(sockid,localaddr,addrlen)
sockid:
socket号.
localaddr:
本地socket地址.
addrlen:
地址长度.
(3).建立socket连接----connect()与accept()调用
这两个系统调用用于完成整个相关的建立.其中connect用于建立连接.调用格为:
connect(sockid,destaddr,addrlen)
destaddr:
指向对方socket地址(信宿地址)结构的指针.
accept:
用于面向连接的服务器,其调用格式为:
newsock=accept(sockid,clientaddr,paddrlen)
clientaddr:
指向客户socket地址指针.
paddrlen:
客户socket地址长度.
(4).listen()调用
此调用用于面向连接服务器,表明它愿意接收连接,listen()在accept()之前调用,格式为:
listen(sockid,quelen)
quelen:
请求队列长度.
(5).发送数据----write(),writev(),send()与sendto(),sendmsg()
用于socket数据发送的系统调用一共有五个,其中三个,write(),writev()和send()用于面向连接传输,其余两个用于无连接传输.面向连接的调用可以不指定信宿地址,而无连接的调用必须指定.假如无连接socket的双方均调用过connect(),可以认为是建立有连接的socket,也可以面向连接调用发送数据.
三个面向连接调用三者的格式大致相同:
write(sockid,buff,bufflen):
缓冲发送
writev(sockid,iovector,vectorlen):
集中发送
send(sockid,buff,bufflen,flags):
可控缓冲发送
其中buff指向发送缓冲区的指针,bufflen是发送缓冲区大小.
用于无连接数据发送的调用有两个:
sendto(sockid,buff,bufflen,flags,dsadd,addrlen)
sendmsg(sockid,message,flags):
可控集中无连接发送.
(6).接收数据----read(),readv(),recv()与recvfrom(),recvmsg()
接收数据与发送数据系统调用是一一对应的,两者参数的最大区别是,前者buffer是一个指针,其所指单元初值为欲读数据长度,调用后的值是实际读出的值.
4:
服务器socket地址的确定
在客户--服务器模型中,所有的作用者都是客户首先发起的(如连接请求,服务请求等),因此客户必须要知道服务器socket地址,另外,客户调用服务器之前,可以在命令行中给出服务器所在主机的域名,根据域名可以获得服务器主机的地址,系统调用为:
hp=gethostbyname(host)。
其中host可以是服务器主机域名,返回hp是一个指向主机地址结构的指针。
五、软件设计
在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式,即客户向服务器发出服务请求,服务器接受到请求后,提供相应的服务。
在该系统中没有采用简单的点对点通信来实现,而采用了比较典型的客户/服务器模式,因为网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不分享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就需要借助服务器模式来实现这一功能。
Socket实现通信时,服务器端先初始化socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。
在这时如果有个客户端初始化一个socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器的连接就建立了。
客户端发送数据请求,服务器接受请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
其实现通信的过程如下图所示:
图1.Socket实现过程示意图
5.1软件设计思路
用VC++的MFC设计对话聊天软件,要经过界面设计,重载函数,映射控件,编辑函数等几个步骤。
设计服务器时,先生成对话框,然后添加两个按钮分别命名为“启动服务器”,“关闭服务器”。
“启动服务器”按钮的导向功能是,启动后,服务器自动进行初始化,并创建、绑定套接字,然后进入监听状态,服务器自动进行初始化,点击开始按钮后,服务器创建套接字、绑定、然后进入监听状态,等待客服端连接请求,当有客户端连接时,服务器读取客户端的信息,并读取显示客户端成员信息于列表中。
“关闭服务器”的导向功能是,点击后,程序自动关闭套接口和退出服务器。
添加一个列表框用于显示读取到的客户端的信息,然后打开类向导,为列表框添加一个成员变量命名为m_msg。
新建一个派生于CAsyncScoket类的新类CNewSocket,此类用于与客户端通信,重载CAsyncScoket的虚函数OnOpen()和OnClose(),当服务器监测到有客户端建立连接时自动调用OnOpen()接收数据并显示在列表框中,服务器的作用是转发数据。
客户端与服务器建立原理机制一样,先MFC建立窗口,然后添加三个编辑框“信息显示栏”、“列表框”、“消息编辑框”,两个按钮“发送”、“退出”,两个列表“在线用户列表”、“选择发送对象栏”。
“信息显示栏”用于显示接收和发出的消息,“列表框”用于显示在线用户,“消息编辑框”用于编辑待发送的消息,“选择发送对象栏”用于选择发送数据的接收方。
5.1.1服务器的实现过程:
(1):
打开一个通信通道(本机的某一端口地址)并告知本地主机,它将在某一公认端口号上接受客户请求;
(2):
等待客户请求到达该端口;
(3):
接受到重复服务请求,处理该请求并发送应答信号。
服务完成后,关闭此进程与客户端的通信链路,并终止;
(4):
返回第二步,等待另一客户请求;
(5):
断开服务器
5.1.2客户端的实现过程:
打开一个通信信道,并连接到服务器所在主机的特定端口(可以通过所在服务器的IP地址来进行连接)。
向服务器发送服务请求;
等待服务器端做出相应的处理并接收应答;
继续提出请求……
请求结束后关闭通信信道并终止连接;
5.2软件设计流程图
5.2.1服务器流程图
图2.服务器端软件流程图
5.2.2客户端流程图
图3.服务器端软件流程图
六、调试过程:
在调试中发现,如果忽略下面任何一个环节,都将导致程序编译无法通过,其中主要是语法错误、逻辑错误、设置错误等类型:
1.在CChatServerDlg类头文件中枚举类型申明函数enum后面对函数中的成员变量以及数据包进行申明。
如本程序中加入SOCKETSocketAccept[20];
SOCKETSockettoListen;
SOCKADDR_INmyaddr,clientaddr;
等函数体
2.对CChatserverDlg的初始化函数OnInitDialog()中正加如下代码:
for(inti=0;
i<
20;
i++)
{SocketAccept[i]=INVALID_SOCKET;
}
3.没有绑定窗口中各个需要控件的成员变量而直接在程序中使用,会导致连接时程序找不到映射体而失败。
4.添加自定义消息时的三个步骤,在.H和.cpp中有三个地方添加:
1.消息函数的定义处;
2.消息函数映射表处;
3.消息函数的申明处
本设计程序中的两个自定义函数:
添加由用户请求连接时的响应函数:
LRESULTCChatserverDlg:
:
OnServerAccept(WPARAMwParam,LPARAMlParam)
添加消息和用户的管理函数:
OnServerreadorclose(WPARAMwParam,LPARAMlParam)
在CChatserverDlg.h头文件中有申明:
afx_msgLRESULTOnServerAccept(WPARAMwParam,LPARAMlParam);
afx_msgLRESULTOnServerreadorclose(WPARAMwParam,LPARAMlParam);
在CChatserverDlg.cpp中也有如下申明:
ON_MESSAGE(WM_SERVER_ACCEPT,OnServerAccept)
ON_MESSAGE(WM_SOCKET_READ,OnServerreadorclose)
5.窗体控件一定要进行成员名设定(如果需要成员变量的),否则在函数编译连接的过程中将会因找不到该函数的申明而报错。
如在调试过程中发现m_send=_T("
"
);
m_read=_T("
m_me=_T("
三个函数未定义;
原因是没有关联成员变量,在窗口中对个相应控件进行关联即解决。
6.同时在对空间进行代码连接时,要在类向导的messageMaps选项卡里面进行成员功能名得设定,平台会自动生成控件功能函数,编辑功能函数,如果是按键空间,者当点击该空间时,就会自动运行该函数中的程序。
7.如果出现连接错误,那么可能是兼容性问题,也可能是软件安装问题,可以很遗憾的告诉你,你的这个问题可能无解;
8.Class中包含了服务器端的所有类和对象的定义,还有全局函数。
Fileview中包含了服务器端的所有代码文件,.h结尾的是头文件,类似于C语言中#inclue<
stdio.h>
的头文件,.cpp结尾的程序文件了,是系统的主要部分,体现了各程序文件之间的调用情况,只用修改source和header部分内容。
Resource中包含了弹出的那些窗口文件,可进行相应的修改。
七、实验结果分析:
图4.运行服务器端后
图5.启动服务器:
图6.启动客户端程序:
填写服务器IP和自己的用户名并连接服务器
图7.连接服务器成功后提示框
图8.连接服务器后两个客户端的通信信息显示1
图9.连接服务器后两客户端的通信信息显示2
本设计完成了课题的基本要求,客服端可以通过输入IP地址连接到服务器,连接成功后也可以实现数据的收、发和显示。
服务器端可以接受连接请求,连接建立后接收数据,显示数据,并转发数据。
各部分效果图如上所示,服务器和客服端除了显示接受数据和相应提示语外,还显示当前时间。
对话界面相对友好,按钮设计较为完整,可以满足点对点对话的基本需求。
但由于各方面原因,未能完成发挥部分。
由上可以看出,相较于QQ或MSN软件的对话框,设计的即时通信系统,能够完成简单的两台机子间的对话,但还是存在很多的不完善,比如还不能进行文件和图片的发送以及语音聊天功能的实现,还需要对更高级的实现进行探索。
虽然在vc++中使用MFC类库进行即时通信软件的设计很方便,但是要真正熟练运用它来实现网络应用程序的开发,则还需要掌握vc++中种类繁多的库函数,以及其他各类控件。
结合本即时通信系统的设计,可以对vc++中winsocket编程做如下总结:
数据收发是通过会话建立和撤销的;
客户端是主动连接,服务程序是被动连接,服务器既可以单独设计,也可以设计一个客户端即作为客户端也作为服务器的一体;
每次收发的数据包,不必关心其大小,socket会自动将它分割成合适的TCP报进行发送,然后会根据接收到的TCP报拼装之后提交用户;
一个ClientSocket只能建立一个与ServerSocket的连接;
5:
一个ServerSocket可以建立多个与ClientSocket的连接;
6:
每一对连接都有唯一用于该连接的一对Socket,可以通过Data属性进行标记区分;
八、体会和建议:
体会:
在为期的两周的课程设计中,我对计算机网络通信即VC++编程有了更进一步的了解,并能够实现网络中的计算机之间的简单通信,在这个课程设计期间,我充分地利用了课本上和参考书上的知识。
由于没有VC++的相关知识,同时也没有winsocket编程的实际操作经验,最开始得知设计的题目后感到的茫然不知所措,促使我到图书馆,书店或者网络上查阅相关的资料,收集有关网络编程的基本原理方法等方面的资料,以及IP协议,ICMP协议文本。
时刻对照老师给的进度安排来调整自己的进度,但现在一步一步的把对话系统编制出来,慢慢的对VC++平台有了一个大致的了解,并学会了一些基础的操作。
以及能够较为熟练的操作VC++实现一些较为简单即时通信软件的编写。
不敢说自己学到了很多,但是知识在于积累。
虽然老师让我们尽量采用delphi软件进行设计,但是由于以前有一点点c的基础,加上VC++类得资料比delphi更容易查到,而且效果也很不错,于是选择了VC++。
其实能进行此类通信软件设计的还远不止这两个平台,比如JAVA,VB等都可以实现,但是由于自己知识的积累不够,对于这些语言更是不了解,因此最终决定在网络代码的基础上,运用VC++来实现基本数据传输功能。
从选择平台的角度来看,我们平时在学专业上的知识的同时还得多多的学习其它有用的东西。
在遇到困难的时候要调整好自己的心态,不要着急,要慢慢的一步一步的去解决。
虽然遇到过很多困难,但在老师和同学们的帮助之下都一一解决了,在这里我要感谢他们的帮助,同时也是我认识到书本知识的重要性,这对于我以后的学习将会有十分巨大的作用。
建议:
可以加长课程设计的时间,像老师说的,搞一个较大的课程,让学生根据实际情况进行分组,这样能够加强学生对追求知识的激情。
建立让每一个学生都能够进行答辩这一个过程,为下学期的毕业答辩做准备,让我们能够提前熟悉这样的过程,不至于到毕业答辩时因紧张而不能发挥出自己的真实水平。
另外,我相信还是有很多同学像我一样只做出了简单的对话环节,对于图片和文件的传输,语音的对话都还没有做出来,如果条件允许的话,让做出来的同学或者老师给我们演示一下,加深我们的印象。
参考文献:
邱仲潘,柯渝.VisualC++6从入门到精通,北京:
电子工业出版社,2005;
沈金龙.计算机通信网[M],西安:
西安电子科技大学出版社,2008;
任泰明.计算机通信网[M],西安:
西安电子科技大学出版社,2009;
王丰锦,邵新宇.基于SOCKET和多线程的应用程序间通信技术的研究[J].计算机应用,2000,20(6):
65-67.
TCP/IP协议与网络编程,任泰明,西安电子科技大学出版社,2004年;
张曜,郭立山,谭超强.C++函数实用手册,北京:
冶金工业出版社,2003;
7:
汪晓平,刘韬.开发网络典型应用实例导航,北京:
人民邮电出版社,2005;
服务器端主要源程序清单
在CChatServerDlg类的头文件中加入如下变量定义:
public:
CChatserverDlg(CWnd*pParent=NULL);
enum{IDD=IDD_CHATSERVER_DIALOG};
SOCKETSocketAccept[20];
SOCKETSockettoListen;
structsendinfo
{
inttype;
charname[20];
charmsg[200