重庆理工大学电子学院即时通信软件设计课程设计论文.docx

上传人:b****5 文档编号:5379033 上传时间:2022-12-15 格式:DOCX 页数:25 大小:261.90KB
下载 相关 举报
重庆理工大学电子学院即时通信软件设计课程设计论文.docx_第1页
第1页 / 共25页
重庆理工大学电子学院即时通信软件设计课程设计论文.docx_第2页
第2页 / 共25页
重庆理工大学电子学院即时通信软件设计课程设计论文.docx_第3页
第3页 / 共25页
重庆理工大学电子学院即时通信软件设计课程设计论文.docx_第4页
第4页 / 共25页
重庆理工大学电子学院即时通信软件设计课程设计论文.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

重庆理工大学电子学院即时通信软件设计课程设计论文.docx

《重庆理工大学电子学院即时通信软件设计课程设计论文.docx》由会员分享,可在线阅读,更多相关《重庆理工大学电子学院即时通信软件设计课程设计论文.docx(25页珍藏版)》请在冰豆网上搜索。

重庆理工大学电子学院即时通信软件设计课程设计论文.docx

重庆理工大学电子学院即时通信软件设计课程设计论文

目录

前言

一、设计目的……………………………………………………………1

二、设计内容……………………………………………………………1

三、设计要求……………………………………………………………1

3.1基本要求…………………………………………………………1

3.2提高要求…………………………………………………………1

四、设计原理……………………………………………………………2

五、软件设计……………………………………………………………5

5.1软件设计思路……………………………………………………6

5.1.1服务器的实现过程…………………………………………7

5.1.2客户端的实现过程…………………………………………7

5.2设计流程图………………………………………………………7

5.2.1服务器流程图………………………………………………7

5.2.2客户端流程图………………………………………………8

六、调试过程……………………………………………………………9

七、实验结果分析………………………………………………………11

八、体会和建议…………………………………………………………13

参考文献…………………………………………………………………14

附录一:

服务器端主要源程序清单…………………………………15

附录二:

客户端主要源程序清单……………………………………21

摘要:

用VC++设计的即时聊天通讯的工具,主要采用client/server结构,并用winsock写实现服务器监听、客户端发送请求信息。

服务器端主要完成监听和接收用户的连接请求,以及管理用户之间的通信和用户的状态,比如登陆和退出聊天室。

服务器端在启动时先建立一个SOCKET用以监听客户端的连接请求,由客户连接时新建一个SOCKET来进行与用户之间的数据传输,客户退出聊天室时释放该用户占有的SOCKET。

客户端主要是客户之间用来法聊天的,客户端启动后首先建立一个SOCKET根据客户输入的服务器的地址和用户名,向服务器发出连接请求,连接成功后就可以用同一个SOCKET用作数据传输,退出聊天室时关闭该SOCKET。

一、设计目的

通过综合课程设计,使学生能够运用《数字信号处理》、《信号与系统》、《通信原理》、《面向对象的程序设计》、《计算机通信网》、《通信协议开发及应用》等课程的知识来设计一个基于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客户端的实现过程:

(1):

打开一个通信信道,并连接到服务器所在主机的特定端口(可以通过所在服务器的IP地址来进行连接)。

(2):

向服务器发送服务请求;

(3):

等待服务器端做出相应的处理并接收应答;继续提出请求……

(4):

请求结束后关闭通信信道并终止连接;

 

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)

添加消息和用户的管理函数:

LRESULTCChatserverDlg:

:

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的头文件,.cpp结尾的程序文件了,是系统的主要部分,体现了各程序文件之间的调用情况,只用修改source和header部分内容。

Resource中包含了弹出的那些窗口文件,可进行相应的修改。

七、实验结果分析:

图4.运行服务器端后

图5.启动服务器:

图6.启动客户端程序:

填写服务器IP和自己的用户名并连接服务器

图7.连接服务器成功后提示框

图8.连接服务器后两个客户端的通信信息显示1

图9.连接服务器后两客户端的通信信息显示2

本设计完成了课题的基本要求,客服端可以通过输入IP地址连接到服务器,连接成功后也可以实现数据的收、发和显示。

服务器端可以接受连接请求,连接建立后接收数据,显示数据,并转发数据。

各部分效果图如上所示,服务器和客服端除了显示接受数据和相应提示语外,还显示当前时间。

对话界面相对友好,按钮设计较为完整,可以满足点对点对话的基本需求。

但由于各方面原因,未能完成发挥部分。

由上可以看出,相较于QQ或MSN软件的对话框,设计的即时通信系统,能够完成简单的两台机子间的对话,但还是存在很多的不完善,比如还不能进行文件和图片的发送以及语音聊天功能的实现,还需要对更高级的实现进行探索。

虽然在vc++中使用MFC类库进行即时通信软件的设计很方便,但是要真正熟练运用它来实现网络应用程序的开发,则还需要掌握vc++中种类繁多的库函数,以及其他各类控件。

结合本即时通信系统的设计,可以对vc++中winsocket编程做如下总结:

1:

数据收发是通过会话建立和撤销的;

2:

客户端是主动连接,服务程序是被动连接,服务器既可以单独设计,也可以设计一个客户端即作为客户端也作为服务器的一体;

3:

每次收发的数据包,不必关心其大小,socket会自动将它分割成合适的TCP报进行发送,然后会根据接收到的TCP报拼装之后提交用户;

4:

一个ClientSocket只能建立一个与ServerSocket的连接;

5:

一个ServerSocket可以建立多个与ClientSocket的连接;

6:

每一对连接都有唯一用于该连接的一对Socket,可以通过Data属性进行标记区分;

八、体会和建议:

体会:

在为期的两周的课程设计中,我对计算机网络通信即VC++编程有了更进一步的了解,并能够实现网络中的计算机之间的简单通信,在这个课程设计期间,我充分地利用了课本上和参考书上的知识。

由于没有VC++的相关知识,同时也没有winsocket编程的实际操作经验,最开始得知设计的题目后感到的茫然不知所措,促使我到图书馆,书店或者网络上查阅相关的资料,收集有关网络编程的基本原理方法等方面的资料,以及IP协议,ICMP协议文本。

时刻对照老师给的进度安排来调整自己的进度,但现在一步一步的把对话系统编制出来,慢慢的对VC++平台有了一个大致的了解,并学会了一些基础的操作。

以及能够较为熟练的操作VC++实现一些较为简单即时通信软件的编写。

不敢说自己学到了很多,但是知识在于积累。

虽然老师让我们尽量采用delphi软件进行设计,但是由于以前有一点点c的基础,加上VC++类得资料比delphi更容易查到,而且效果也很不错,于是选择了VC++。

其实能进行此类通信软件设计的还远不止这两个平台,比如JAVA,VB等都可以实现,但是由于自己知识的积累不够,对于这些语言更是不了解,因此最终决定在网络代码的基础上,运用VC++来实现基本数据传输功能。

从选择平台的角度来看,我们平时在学专业上的知识的同时还得多多的学习其它有用的东西。

在遇到困难的时候要调整好自己的心态,不要着急,要慢慢的一步一步的去解决。

虽然遇到过很多困难,但在老师和同学们的帮助之下都一一解决了,在这里我要感谢他们的帮助,同时也是我认识到书本知识的重要性,这对于我以后的学习将会有十分巨大的作用。

建议:

可以加长课程设计的时间,像老师说的,搞一个较大的课程,让学生根据实际情况进行分组,这样能够加强学生对追求知识的激情。

建立让每一个学生都能够进行答辩这一个过程,为下学期的毕业答辩做准备,让我们能够提前熟悉这样的过程,不至于到毕业答辩时因紧张而不能发挥出自己的真实水平。

另外,我相信还是有很多同学像我一样只做出了简单的对话环节,对于图片和文件的传输,语音的对话都还没有做出来,如果条件允许的话,让做出来的同学或者老师给我们演示一下,加深我们的印象。

 

参考文献:

1:

邱仲潘,柯渝.VisualC++6从入门到精通,北京:

电子工业出版社,2005;

2:

沈金龙.计算机通信网[M],西安:

西安电子科技大学出版社,2008;

3:

任泰明.计算机通信网[M],西安:

西安电子科技大学出版社,2009;

4:

王丰锦,邵新宇.基于SOCKET和多线程的应用程序间通信技术的研究[J].计算机应用,2000,20(6):

65-67.

5:

TCP/IP协议与网络编程,任泰明,西安电子科技大学出版社,2004年;

6:

张曜,郭立山,谭超强.C++函数实用手册,北京:

冶金工业出版社,2003;

7:

汪晓平,刘韬.开发网络典型应用实例导航,北京:

人民邮电出版社,2005;

 

附录一:

服务器端主要源程序清单

在CChatServerDlg类的头文件中加入如下变量定义:

public:

CChatserverDlg(CWnd*pParent=NULL);

enum{IDD=IDD_CHATSERVER_DIALOG};

SOCKETSocketAccept[20];

SOCKETSockettoListen;

SOCKADDR_INmyaddr,clientaddr;

structsendinfo

{

inttype;

charname[20];

charmsg[200

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1