1东南大学自动化学院实验报告课程名称:信息通信网络概论第4次实验实验名称:实验四﹑计算机网络通信应用程序设计院(系):自动化专业:自动化姓名:学号:实验室:金智楼实验组别:同组人员:实验时间:2016年12月20日评定成绩:审阅教师:2目录(一)基于TCP/IP的计算机网络通信应用程序设计一.实验目的和要求····················································3二.实验原理··························································3三.实验方案与实验步骤················································3四.实验设备与器材配置················································4五.实验记录··························································4六.实验总结·························································11附录:部分代码(二)基于UDP/IP的计算机网络通信应用程序设计一.实验目的和要求··················································17二.实验原理························································17三.实验方案与实验步骤··············································17四.实验设备与器材配置··············································18五.实验记录························································18六.实验总结························································25七.思考题或讨论题··················································25附录:部分代码3(一)基于TCP/IP的计算机网络通信应用程序设计一.实验目的和要求1.通过本实验课程的学习,使学生能够理解TCP协议通信的基本原理。2.通过运用WinSock接口编写网络通信应用程序,掌握TCP网络应用程序架构的设计思想。3.学会设计利用TCP简单的应用层协议。二.实验原理TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。这个连接一但建立,两台计算机之间就可以把数据当作一个双向字节流进行交换。三.实验方案与实验步骤1、客户机/服务器工作流程服务器端1:创建套接字并将套接字绑定到一个本地地址和端口上(create)。2:将套接字设为监听模式,准备接受客户请求(listen)。3:等待客户请求到来;请求到来后,接受请求,返回一个新的对应于此次连接的套接字(accept)。4:用返回的套接字和客户端进行通信(send/receive)。5:返回,等待另一客户请求。6:关闭套接字。客户端1:创建套接字(create)。2:向服务器发出连接请求(connect)。3:和服务器进行通信(send/receive)。4:关闭套接字。4创建套接字Create()创建套接字Create()监听模式Listen()接受请求Accept()与客户端通信Send/Receive()返回,等待另一客户请求关闭套接字向服务器发出连接请求Connect()与服务器通信Send/Receive()关闭套接字(a)服务器工作流程(b)客户机工作流程图3.1客户机/服务器工作流程2、系统实现利用MFCAppWizard生成程序框架增加控件对象从CAsyncSocket类继承建立客户机与服务器之间的连接发送和接收数据终止连接图3.2系统实现过程四.实验设备与器材配置电脑、VC6.0五.实验记录51、界面(1)选择:客户机、服务器;(2)输入:IP设置、端口设置、输入内容;(3)输出显示:消息列表、发送和接收消息数目;(4)按钮:连接/侦听、发送、清空、退出。图5.1界面设计2、功能描述(1)初始化:服务器点击侦听,客户机输入服务器IP后,点击连接实现服务器——客户机之间的连接通信。在界面上显示连接信息,服务器向客户机发送Welcomemyfriend!,客户机向服务器发送IamPaul。6图5.2初始化(2)客户机与服务器对话:服务器显示Server:+发送的消息,客户机显示Paul:+发送的信息。图5.3客户机与服务器对话7(3)输入/n在聊天对话框画一个牛,输入/p画一个电话图5.4输入/p画一个电话图5.5输入/n画一个电话(4)输入/l会弹出一个对话框8图5.6输入/l弹出一个对话框(5)输入/r会打开一个windows资源管理器,并打开指定的路径,当前设置的路径为:C:/windows/media图5.7输入/r打开一个windows资源管理器93、改进(1)获取发送方主机名和发送时间通过函数gethostname(hostname,sizeof(hostname))得到主机名,客户机获得服务器主机名为2013-20140524WQ,服务器获得客户机主机名为2013-20140524WQ(实验时使用同一台电脑进行调试,所以主机名是一样的),添加到接收信息列表中信息前面。通过函数time()、localtime()获得当前系统时间,能够显示发送接收时间,格式为年/月/日时/分/秒,添加到接收信息列表中信息首部。图5.8获取主机名、添加发送时间(2)自定义字符画:定义字符串TP_xin_str,输入/x时调用绘制一个小象10图5.9自定义字符画(3)自定义表情符号:输入/s时输出难过(╥﹏╥),输入/a时输出生气(▼皿▼#),输入/j时输出惊讶(⊙o⊙)等。图5.10自定义表情符号11(4)显示发送、接收消息总数通过m_list.GetCount()函数实现对列表中发送和接收到的信息计数,并显示在界面上。初始化时,发送数和接收数均为1,清空列表后,相应的重置为0。(5)清空列表通过函数m_list.ResetContent()实现清空列表。(6)添加背景图片、改变控件背景色、字体等。上传bmp图片到Bitmap资源文件夹中,在OnPaint()中添加代码,通过不同图片的ID来设置不同的背景图片。通过加入WM_CTLCOLOR消息,自动生成OnCtlColor()函数,利用SetBkMode()、SetTextColor()、SetBkColor()、CreateSolidBrush()、SetFont()等函数设置背景格式、改变控件背景色和字体大小颜色等。图5.10其他功能六.实验总结这次实验与实验三较为相似,在上次的基础上,增加了自定义字符画、符号表情等,进一步加深了对TCP/IP协议的理解,也能够根据生活中的聊天工具如QQ等,增加一些类似的功能,使其应用性更强。12附录:(部分代码)1、获取对方主机信息添加发送接收时间(客户端和服务器类似,在此只贴出服务器代码)voidCProject2Dlg::OnServerReceive(){CStringmDay;CStringmTime;CStringttime;time_tt1;t1=time(NULL);//机器时间structtm*p;p=localtime(&t1);//转换为本地时间mDay.Format(%4d/%2d/%2d,1900+p-tm_year,1+p-tm_mon,p-tm_mday);mTime.Format(%3d:%2d:%2d,p-tm_hour,p-tm_min,p-tm_sec);BOOLAct=FALSE;CStringnRev,nret,nRet;charbuf[MAX_BUFFER+1];intret,i,len;charhostname[100];ret=m_connectsocket.Receive(buf,MAX_BUFFER,0);if(ret!=SOCKET_ERROR){gethostname(hostname,sizeof(hostname));//获取对方主机名m_receive+=1;//接收消息数加1buf[ret]=NULL;nRev=buf;nRet+=mDay+mTime++hostname+;//添加发送时间和主机名nret+=CLIENT;nret+=:;len=nret.GetLength();nret=nRev.Right(((nRev.GetLength())-len));if(nret.GetAt(0)=='/'){m_list_msg.AddString(nRet);Act=DoAction(nret);}if(Act==FALSE){nRet+=nRev;m_list_msg.AddString(nRet);}i=m_list_msg.GetCount();13m_list_msg.SetCurSel(i-1);m_list_msg.SetCurSel(-1);UpdateData(FALSE);}elseAfxMessageBox(消息接收错误!);}2、显示发送、接收消息总数voidCProject2Dlg::OnSendMsg(){//TODO:AddyourcontrolnotificationhandlercodehereCStringbuf;intnret;BOOLAct=FALSE;intnLen,i;UpdateData(TRUE);m_outmsg.TrimLeft();if(m_outmsg.IsEmpty()){AfxMessageBox(对不起,不能发送空消息!);return;}if(m_server==TRUE){buf+=SERVER;buf+=:;}else{buf+=CLIENT;buf+=:;}buf+=m_outmsg;nLen=buf.GetLength();nret=m_connectsocket.Send((LPCTSTR)buf,nLen);if(nret!=SOCKET_ERROR){m_send+=1;//发送消息数加1if(m_outmsg.GetAt(0)=='/'){Act=DoAction(m_outmsg);}if(Act==FALSE){14m_list_msg.AddString((LPCTSTR)buf);}m_outmsg.Empty();i=m_list_msg.GetCount();m_list_msg.SetCurSel(i-1);m_list_msg.SetCurSel(-1);UpdateData(FALSE);}elseAfxMessageBox(消息发送失败!:();}3、清空列表voidCProject2Dlg::OnRemoveall(){//TODO:Addyourcontrolnotificationhandlercodeherem_list_msg.ResetContent();//清空列表m_receive=0;//重置接收消息数m_send=0;//重置发送消息数UpdateData(FALSE);}4、自定义字符画voidCProject2Dlg::DrawXin(){CStringTP_xin_str[7]={____,/\\~~~/\\,,----(..),/\\____/,/|(\\|(,^\\/___\\/\\|,|__||__|-“};intTP_xin_int=7;for(inti=0;iTP_xin_int;i++){m_list_msg.AddSt