东南大学自动化学院实验报告课程名称:信息通信网络概论第三次实验实验名称:基于客户/服务器模式的网络通信客户端和服务器端设计院(系):自动化专业:自动化姓名:耿佳辉学号:08011317实验室:403实验组别:同组人员:实验时间:2013年12月16日评定成绩:审阅教师:目录一.实验目的和要求………………………………………………3二.实验原理………………………………………………………3三.实验方案与实验步骤………………………………………3四.实验设备与器材配置…………………………………………3五.实验记录………………………………………………………3六.思考题或讨论题………………………………………………4实验报告内容:一.实验目的和要求1》在前面两个实验的基础上进一步了解网络编程的过程。2》掌握Windows环境下基于WinSock的编程方法和通讯实现。3》编写一个聊天程序,即以客户端和服务器的模式进行互发消息。利用客户端和服务器模式,编写一个点对点的,可以相互发送和接收消息的程序,也就是常说的聊天工具。该工具具有既可以作为服务器也可以做为客户端使用。当作为服务器时,能输入IP值和端口值,并能进行在线侦听,能接受连接请求,并实现消息互发。当作为客户端时,能输入服务器的IP值和端口值,并进行连接请求,能与服务器进行互发消息,聊天结束后还要实现与服务器的断开的功能。二.实验原理三.实验方案与实验步骤使用的函数服务器端:•建立Socket:调用成员函数Socket()函数•绑定端口:调用成员函数bind()函数(注:对于MFC编程我们只要调用Create()函数就可以包括上面的两个函数)•监听:调用成员函数listen()函数CMySocketm_sConnectSocket;CMySocketm_sListenSocket;//是客户机还是服务器if(m_cmbType.GetCurSel()==1){//是服务器//创建于设置端口绑定的套接字m_sListenSocket.Create(m_nServPort);//开始侦听m_sListenSocket.Listen();}else{//是客户机//创建一个默认的套接字m_sConnectSocket.Create();////发出连接请求m_sConnectSocket.Connect(m_strServName,m_nServPort);}•监听:调用成员函数listen()函数•服务器端接受客户端的连接请求:调用成员函数accept()函数//对于服务器voidCgengjiahuiDlg::OnAccept(){//对于服务器//接受连接请求m_sListenSocket.Accept(m_sConnectSocket);}//接受连接请求//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////客户端:•建立客户端的Socket:调用socket()函数(注:我们也是调用Create()函数来完成Socket的建立的)•提出连接申请:调用成员函数connect()函数以上这些函数我们是在重载前面的虚拟函数时使用的,例如OnAccept()函数中调用accept()函数等等。数据发送部分voidCgengjiahuiDlg::OnSendMsg(){intnLen;//消息长度intnSent;//已发送消息的长度//从对话框取回数据UpdateData(TRUE);//判断要发送的消息是否为空if(!m_strMsg.IsEmpty()){//获取消息的长度nLen=m_strMsg.GetLength();//发送消息nSent=m_sConnectSocket.Send(LPCTSTR(m_strMsg),nLen);//发送是否成功if(nSent!=SOCKET_ERROR){//将消息添加到“已发送列表框”m_listSent.AddString(m_strMsg);//更新对话框UpdateData(FALSE);}else{AfxMessageBox(信息发送错误,MB_OK|MB_ICONSTOP);}接收,数据段处理部分char*pBuf=newchar[1025];//charpBuf[1025];intnBufSize=1024;intnReceived;CStringstrReceived;//接收消息nReceived=m_sConnectSocket.Receive(pBuf,nBufSize);//判断消息接收是否成功?if(nReceived!=SOCKET_ERROR){//保留接收消息的有效部分pBuf[nReceived]=NULL;//将消息转化为CString对象strReceived=pBuf;//将消息添加到“已接收的消息”列表框m_listReceived.AddString(strReceived);//更新对话框//UpdateData(FALSE);}else{AfxMessageBox(信息接收错误!,MB_OK|MB_ICONSTOP);}deletepBuf;四.实验设备与器材配置实验环境visualc++6.0MFC五.实验记录六.实验总结这个应用程序在MFCWinSock编程中很有代表性,可以用于两台计算机之间进行字符串传输;创建思路简单,就是利用MFCAppWizard生成程序框架,通过对CAsynSocket类增加一个指向对话框类得指针,对CAsynSocket类中的一些事件处理函数进行重载,使这些套接字事件发生时,应用程序能够自动到对话框类中寻找合适的函数执行。这个聊天室应用程序是基于客户/服务器模型的,一个服务器只能支持一个客户,因此它实际上是一个基于“点对点”模型的应用程序。通过这个应用程序,用户可以在两台计算机之间进行字符串传输——即可以为两个人进行网上聊天提供服务,而且两个人的传输的字符串被保留在程序的列表框中,并且进行分类,分为传送和接收的字符串。七.思考题或讨论题1.本次实验所涉及的“实体”是什么?实体间通过什么方式建立协议?答:实体,可以理解为具体的设备,计算机之类的终端、路由器交换机之类的连接设备都是实体。本次实验中实体即客户端和服务器,是通过创建套接字,服务器端侦听,客户端发送连接请求,然后服务器和客户端连接,即客户端-服务器方式建立协议.TCP/IP应用服务采用客户机/服务器工作模式,服务器端启动守护进程,等待客户端的请求;服务器对应客户端的请求,派生子进程与客户进程进行数据通信,提供服务。2.服务和协议的区别与联系?本次实验的协议过程(即客户-服务器方式)是怎样建立的?用哪那些服务?答:首先,协议的实现保证了能够向上一层提供服务,使用本层服务的实体只能看见服务而无法看见下面的协议,协议是水平的。下面的协议对上面的实体是透明的其次,协议是“水平的”即协议是控制对等实体之间通信的规则但服务是“垂直的”,即服务是由下层向上层通过层间接口提供的。另外,并非在一个层内完成的全部功能都称之为服务,服务是上下的。只有那些能够被高一层实体看得见的功能才能被称之为“服务”TCP/IP应用服务采用客户机/服务器工作模式,服务器端启动守护进程,等待客户端的请求;服务器对应客户端的请求,派生子进程与客户进程进行数据通信,提供服务。(1)服务器(HostA)首先要启动应用程序服务进程(守护进程Server),等待客户端的请求。(2)当服务进程Server接收到客户端HostB的请求时,派生一个子进程(Child1)与HostB进行交互,实现数据通信,同时守护进程Server继续等待客户端的请求。(3)当服务进程Server接收到客户端HostC的请求时,派生一个子进程(Child2)与HostC进行交互,实现数据通信,同时守护进程Server继续等待客户端的请求。本次实验客户-服务器协议主要提供发送消息和接收消息的服务。3.本次实验的协议提供了什么服务?试想,用此协议还可以提供怎样的服务?这种服务在自动化学科领域的意义是什么?(1)简单的信息传递,即使用套接字处理消息的发送和接收。(2)处理文件的传输。传输都是基于文本流进行的,协议提供了接收文本流和发送文本流的服务,因此,可以进行文本传输。以上两种服务,都是由程序员自定义进行的。(3)在更高一层上,该协议还可以提供很多的高端服务:对于自动化的意义:TCP/IP协议不依赖于任何特定的计算机硬件或操作系统,提供开放的协议标准,即使不考虑Internet,TCP/IP协议也获得了广泛的支持。所以TCP/IP协议成为一种联合各种硬件和软件的实用系统。TCP/IP协议并不依赖于特定的网络传输硬件,所以TCP/IP协议能够集成各种各样的网络。用户能够使用以太网(Ethernet)、令牌环网(TokenRingNetwork)、拨号线路(Dial-upline)、X.25网以及所有的网络传输硬件。统一的网络地址分配方案,使得整个TCP/IP设备在网中都具有惟一的地址标准化的高层协议,可以提供多种可靠的用户服务。IP传输通用数据。数据能够用于任何目的,并且能够很轻易地取代以前由专有数据网络传输的数据