东南大学自动化学院
实 验 报 告
课程名称: 信息通信网络概论
第4次实验
实验名称: 实验四﹑计算机网络通信应用程序设计
院 (系): 自动化 专 业: 自动化
姓 名: 学 号:
实 验 室: 金智楼 实验组别:
同组人员: 实验时间: 2016 年 12 月 20 日
评定成绩: 审阅教师:
(一)基于TCP/IP的计算机网络通信应用程序设计
一.实验目的和要求 ···················································· 3
二.实验原理 ·························································· 3
三. 实验方案与实验步骤 ················································ 3
四.实验设备与器材配置 ················································ 4
五.实验记录 ·························································· 4
六.实验总结 ························································· 11
附录:部分代码
(二)基于UDP/IP的计算机网络通信应用程序设计
一.实验目的和要求 ·················································· 17
二.实验原理 ························································ 17
三. 实验方案与实验步骤 ·············································· 17
四.实验设备与器材配置 ·············································· 18
五.实验记录 ························································ 18
六.实验总结 ························································ 25
七.思考题或讨论题 ·················································· 25
附录:部分代码
(一)基于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:关闭套接字。
图3.1 客户机/服务器工作流程
2、 系统实现
图3.2 系统实现过程
四. 实验设备与器材配置
电脑、VC6.0
五. 实验记录
1、 界面
(1) 选择:客户机、服务器;
(2) 输入:IP设置、端口设置、输入内容;
(3) 输出显示:消息列表、发送和接收消息数目;
(4) 按钮:连接/侦听、发送、清空、退出。
图5.1 界面设计
2、 功能描述
(1)初始化:服务器点击侦听,客户机输入服务器IP后,点击连接实现服务器——客户机之间的连接通信。在界面上显示连接信息,服务器向客户机发送Welcome my friend!,客户机向服务器发送I am Paul。
图5.2 初始化
(2)客户机与服务器对话:服务器显示Server:+发送的消息 ,客户机显示Paul:+发送的信息。
图5.3客户机与服务器对话
(3)输入/n在聊天对话框画一个牛,输入/p画一个电话
图5.4 输入/p画一个电话
图5.5 输入/n画一个电话
(4)输入/l会弹出一个对话框
图5.6 输入/l弹出一个对话框
(5)输入/r会打开一个windows资源管理器,并打开指定的路径,当前设置的路径为:C:/windows/media
图5.7 输入/r打开一个windows资源管理器
3、 改进
(1) 获取发送方主机名和发送时间
通过函数gethostname(hostname,sizeof(hostname))得到主机名,客户机获得服务器主机名为2013-20140524WQ,服务器获得客户机主机名为2013-20140524WQ(实验时使用同一台电脑进行调试,所以主机名是一样的),添加到接收信息列表中信息前面。
通过函数time()、localtime()获得当前系统时间,能够显示发送接收时间,格式为年/月/日 时/分/秒,添加到接收信息列表中信息首部。
图5.8 获取主机名、添加发送时间
(2) 自定义字符画:定义字符串TP_xin_str,输入/x时调用绘制一个小象
图5.9 自定义字符画
(3) 自定义表情符号:输入/s时输出"难过(╥﹏╥)",输入/a时输出
"生气(▼皿▼#)",输入/j时输出"惊讶(⊙o⊙)"等。
图5.10 自定义表情符号
(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等,增加一些类似的功能,使其应用性更强。
附录:(部分代码)
1、获取对方主机信息添加发送接收时间(客户端和服务器类似,在此只贴出服务器代码)
void CProject2Dlg::OnServerReceive()
{
CString mDay;
CString mTime;
CString ttime;
time_t t1;
t1 = time(NULL); //机器时间
struct tm *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);
BOOL Act=FALSE;
CString nRev,nret,nRet;
char buf[MAX_BUFFER+1];
int ret,i,len;
char hostname[100];
ret=m_connectsocket.Receive(buf,MAX_BUFFER,0);
if(ret!=SOCKET_ERROR)
{
gethostname(hostname,sizeof(hostname));//获取对方主机名
m_receive+=1;//接收消息数加1
buf[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();
m_list_msg.SetCurSel(i-1);
m_list_msg.SetCurSel(-1);
UpdateData(FALSE);
}
else
AfxMessageBox("消息接收错误!");
}
2、 显示发送、接收消息总数
void CProject2Dlg::OnSendMsg()
{
// TODO: Add your control notification handler code here
CString buf;
int nret;
BOOL Act=FALSE;
int nLen,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;//发送消息数加1
if(m_outmsg.GetAt(0)=='/')
{
Act=DoAction(m_outmsg);
}
if(Act==FALSE)
{
m_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);
}
else
AfxMessageBox("消息发送失败! :(");
}
3、 清空列表
void CProject2Dlg::OnRemoveall()
{
// TODO: Add your control notification handler code here
m_list_msg.ResetContent();//清空列表
m_receive=0;//重置接收消息数
m_send=0;//重置发送消息数
UpdateData(FALSE);
}
4、 自定义字符画
void CProject2Dlg::DrawXin()
{
CString TP_xin_str[7]=
{
" __ __ ",
" / \\~~~/ \\",
" ,----( .. ) ",
" / \\__ __/ ",
" /| (\\ |( ",
" ^ \\ /___\\ /\\ | ",
" |__| |__|-“ "
};
int TP_xin_int=7;
for(int i=0;i
{
m_list_msg.AddString(TP_xin_str[i]);
}
}
5、 自定义表情符号
switch(act.GetAt(1))
{
case'm':ShellExecute(NULL,NULL,"老人与海.mp3","wmplayer.exe", NULL,SW_SHOWMAXIMIZED );return TRUE;
case 'q':AfxMessageBox("Quit");return TRUE;
case 'l':AfxMessageBox("开心(*^ω^*)");return TRUE;
case 's':AfxMessageBox("难过(╥﹏╥)");return TRUE;
case 'a':AfxMessageBox("生气(▼皿▼#)");return TRUE;
case 'j':AfxMessageBox("惊讶(⊙o⊙)");return TRUE;
case 'c':AfxMessageBox("Circle OoOoOo");return TRUE;
case 'r'://AfxMessageBox("Rectangle ");
ShellExecute(NULL,"explore","C:/windows/media",
NULL,NULL,SW_SHOWNORMAL);return TRUE;
case 'n':DrawNiu();return TRUE;
case 'p':DrawPhone();return TRUE;
case 'x':DrawXin();return TRUE;
default: return FALSE;
}
6、 添加背景图片
void CProject2Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon); // Draw the icon
}
else
{
//CDialog::OnPaint();
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP是图对应的ID
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap*pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
}
}
7、 改变背景色、字体大小颜色等
HBRUSH CProject2Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
//设置显示字体
CFont * cFont=new CFont;
cFont->CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,"Arial");
if(pWnd == this)//改变整个界面背景色
{
HBRUSH brush=CreateSolidBrush(RGB(199,237,204));
return (HBRUSH)brush;
}
switch(nCtlColor)
{
case CTLCOLOR_STATIC: //对所有静态文本控件的设置
{
pDC->SetBkMode(TRANSPARENT); //设置背景为透明
pDC->SetTextColor(RGB(255,255,0)); //设置字体颜色
pWnd->SetFont(cFont); //设置字体
HBRUSH B = CreateSolidBrush(RGB(199,237,204)); //创建画刷
return (HBRUSH) B; //返回画刷句柄
}
break;
default:
return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
(二)基于UDP/IP的计算机网络通信应用程序设计
一、 实验目的和要求
1. 通过本实验课程的学习,使学生能够理解UDP协议通信的基本原理。
2. 通过运用WinSock接口编写网络通信应用程序,掌握UDP网络应用程序架构的设计思想。
3. 学会设计利用UDP简单的应用层协议。
二、 实验原理
UDP是无连接通信协议,UDP不保证可靠数据的传输,但能够向若干个目标发送数据,接收发自若干个源的数据。简单地说,如果一个主机向另外一台主机发送数据,这一数据就会立即发出,而不管另外一台主机是否已准备接收数据。如果另外一台主机收到了数据,它不会确认收到与否。
三、 实验方案与实验步骤
服务器端
1.创建套接字并将套接字绑定到一个本地地址和端口上(create);
2.等待接收数据(ReceiveFrom);
3.关闭套接字。
客户端
1.创建套接字(create);
2.向服务器发送数据(sendto);
3.关闭套接字。
四、 实验设备与器材配置
电脑、VC6.0
五、 实验记录
1、 界面
(1) 输入:IP设置、端口设置、输入内容;
(2) 输出显示:消息列表;
(3) 按钮:发送、清空列表、导出消息记录、退出。
图5.1 界面设计
2、 功能描述
(1) 初始化:客户机输入服务器IP223.3.202.241后,点击开始聊天。
(a)客户端初始化
(b)服务器初始化
图5.2 初始化
(2) 客户机与服务器对话:此时服务器并没有填写客户机的IP地址,能够接收到客户机发送的消息,并且获得发送方IP。但是不能发送消息给客户机,只有填写客户机IP223.3.210.241后,才能发送消息给客户机。
(a)客户机端界面
(b)服务器端界面
图5.3 客户机与服务器对话
(a)客户机端界面
(b)服务器端界面
图5.3客户机与服务器对话
(3)输入/n在聊天对话框画一个牛,输入/p画一个电话
图5.4 字符画
(4)输入/r会打开一个windows资源管理器,并打开指定的路径,当前设置的路径为:C:/windows/media
图5.7 输入/r打开一个windows资源管理器
3、 改进
(1)添加发送时间
通过函数time()、localtime()获得当前系统时间,能够显示发送接收时间,格式为年/月/日 时/分/秒,添加到接收信息列表中信息首部。
(2)清空列表
通过函数m_list.ResetContent()实现清空列表。
(3)导出消息记录
通过函数m_list_msg.GetText()把列表中的信息写入字符串中,再利用文件读写函数fopen()、fwrite()、fclose()将字符串写入指定文件中。
图5.8 导出消息记录到txt中
(4)输入/e打开指定网址,输入/t打开指定图片
图5.9 输入指定字符执行相应的操作
(5)添加背景图片、改变控件背景色、字体等。
方法与实验(一)中相同,不再赘述。
图5.10 其他功能
六、 实验总结
在原有程序的基础上,增加了保存消息记录、自定义协议等功能,同时修改了界面,但是对于MFC中按钮的界面设置仍然不太了解,尝试直接在WM_CTLCOLOR消息自动生成OnCtlColor()函数中进行设置,没有达到预期效果,希望在以后的学习过程中能够学到并解决这个问题。
通过这次实验,我对TCP协议和UDP协议各自的特点有了一定理解,能够判断在不同场合下应使用哪个协议,掌握并理解了它们的区别和各自的优缺点。
七、 思考题或讨论题
1、 结合所学知识与实验中的感受,说明TCP协议和UDP协议各自的优缺点。在工业控制的现场中,要通过网络控制一台焊接机器人的运行,要求控制数据能正确传输。试分析说明,采用哪种运输层协议比较好?另外,网络中使用的IP电话服务采用的是哪种运输层协议?为什么要采用这种协议?并说明理由。
(1) TCP协议和UDP协议各自的优缺点:TCP-有连接,所以握手过程会消耗资源,过程为可靠连接,不会丢失数据,适合大数据量交换;UDP-非可靠连接,会丢包,没有校验,速度快,无须握手过程; tcp需要首先建立连接,而udp只要绑定端口发送就行,tcp如果建立连接以后,能够保证传送的数据包次序,而udp则不能保证数据包到达的先后次序,甚至会丢包;编程时,TCP面向连接的,即每次收发数据之前必须通过connect建立连接,也是双向的,即任何一方都可以收发数据,协议本身提供了一些保障机制保证它是可靠的、有序的,即每个包按照发送的顺序到达接收方。UDP它是无连接的,不可靠的,因为通讯双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。任何一方建立一个socket以后就可以用sendto发送数据,也可以用recvfrom接收数据。根本不关心对方是否存在,是否发送了数据。它的特点是通讯速度比较快。
(2) 应采用TCP协议,TCP-有连接, 过程为可靠连接,不会丢失数据,能保证数据正确传输。
(3) 网络中使用的IP电话服务采用的是UDP协议,IP电话是实时传输,必须使用UDP。UDP 不保证可靠交付,但UCP 比TCP 的开销要小很多,IP电话接受这样的服务质量就可以使用UDP。
2、思考和调研目前常用的通信工具之一:QQ的基本实现方式。考虑其各种不同的应用可能采取的是TCP和UDP中的哪种协议。如果需要对本实验结果进行进一步改进,有哪些想法。
附录:(部分代码)
1、 清空列表
void CUDPprojectDlg::OnDelete()
{
// TODO: Add your control notification handler code here
m_list_msg.ResetContent();//清空列表
}
2、 导出消息记录
void CUDPprojectDlg::OnDownload()
{
// TODO: Add your control notification handler code here
CString content;
CString temp;
for(int i=0;i
{
m_list_msg.GetText(i,temp);//将列表中内容写入字符串temp
content+=temp;
content+="\r\n";
}
FILE * fp;
fp = fopen("f:\\消息记录.txt", "a+");//打开指定目录
fwrite(content, strlen(content), 1, fp);//写入字符串
fclose(fp);
}
3、 自定义指定操作
void CUDPprojectDlg::DoAction(LPVOID lParam, char str)
{
CUDPprojectDlg *pDlg = (CUDPprojectDlg*)lParam;
switch(str)
{
case 'n': pDlg->DrawNiu();break;
case 'z': pDlg->DrawPig();break;
case 'p': pDlg->DrawPhone();break;
case'e':ShellExecute(NULL,"open","http://jwc.seu.edu.cn", NULL, NULL, SW_SHOWNORMAL);break;//打开网址
case 't': ShellExecute(NULL,"open","F:/4.jpg",NULL,NULL,SW_SHOWNORMAL);break;
//打开图片
case'r':ShellExecute(NULL,"explore","C:/windows/media",NULL,NULL,SW_SHOWNORMAL);break;
default: pDlg->m_list_msg.AddString("该字母对应操作尚未定义!");break;
}
}
4、 设置控件背景透明
HBRUSH CUDPprojectDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if((pWnd ->GetDlgCtrlID())==IDC_EDIT_OUTMSG)//输入框背景
{
HBRUSH brush=CreateSolidBrush(RGB(255,255,255));
return (HBRUSH)brush;
}
else if(nCtlColor == CTLCOLOR_STATIC) //对所有静态文本控件的设置
{
pDC->SetBkMode(TRANSPARENT); //设置背景为透明
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
else
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Return a different brush if the default is not desired
return hbr;
}
CRect rcStatic;
this->GetDlgItem(IDC_STATIC_STATE)->GetWindowRect(&rcStatic);
ScreenToClient(&rcStatic);
InvalidateRect(&rcStatic);//重新绘制
this->GetDlgItem(IDC_EDIT_PORT)->EnableWindow(TRUE);
this->SetDlgItemText(IDC_CONNECT,"开始聊天");
this->SetDlgItemText(IDC_STATIC_STATE," 请进行初始化设置@_@");
this->GetDlgItem(IDC_EDIT_OUTMSG)->EnableWindow(FALSE);
return;
本文来源:https://www.2haoxitong.net/k/doc/b371ead678563c1ec5da50e2524de518974bd3f7.html
文档为doc格式