多人聊天程序设计.docx
《多人聊天程序设计.docx》由会员分享,可在线阅读,更多相关《多人聊天程序设计.docx(9页珍藏版)》请在冰豆网上搜索。
多人聊天程序设计
Internet网络程序设计实验报告
基于Socket的多人聊天室程序设计
姓名:
莫敌
班级:
软件0904
学号:
U200917895
指导老师:
陆永忠
2012.03.31
目录
1实验目的及要求2
1.1实验目的2
1.2实验要求2
2实验环境3
3实验程序设计3
3.1设计思想3
3.2程序设计流程框图4
3.3详细设计5
3.3.1界面设计6
3.3.2主要功能实现6
3.4运行结果9
4实验感想11
1实验目的及要求
1.1实验目的
熟悉典型协议的通讯机制,掌握基于它们的网络系统设计方法。
1.2实验要求
编写复杂的多人聊天室程序。
2实验环境
编译环境:
Windows7+VisualStudio2010使用MFC编写。
运行环境:
Windows7操作系统。
3实验程序设计
3.1设计思想
根据实验的要求:
在联网的多台计算机之间实现多人聊天功能,则需要程序提供一种快速、简便的网络传输服务来保证聊天的实时性。
在分析、对比了传输层协议TCP协议和UDP协议后,了解到UDP协议提供的是一种无连接的、面向事务的简单传输协议,符合多人聊天室的应用需求,即程序保证实时性,同时对传输中发生的错误有一定的容忍性。
而TCP协议很难保证多人聊天时数据传输的实时性。
所以对于该程序实时性应放在首要地位予以考虑和设计。
于是,我采用基于UDP协议的Windowssockets来设计实现本实验。
3.2程序设计流程框图
图1程序设计流程框图
3.3详细设计
基于UDP的socket编程流程:
服务器端:
Ø创建套接字(socket)。
Ø将套接字绑定到一个本地地址和端口上(bind)。
Ø等待接收数据(recvfrom)。
Ø关闭套接字。
客户端:
Ø创建套接字(socket)。
Ø向服务器发送数据(sendto)。
Ø关闭套接字。
3.3.1界面设计
图2程序界面
程序由四部分组成:
聊天室聊天内容的接收栏、IP地址控件,用户聊天内容的发送栏和内容发送按钮。
聊天室聊天内容的接收栏:
接收并显示聊天室中聊天者发送的内容;IP地址控件:
发送目的地的IP地址;用户聊天内容的发送栏:
显示聊天者将要发送的内容;内容发送按钮:
单击后将用户聊天内容的发送栏的信息发送给目标计算机。
3.3.2主要功能实现
套接字库加载:
AfxSocketInit()
套接字初始化:
boolCChatroomDlg:
:
initSocket(void)
{
m_socket=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==m_socket)
{
AfxMessageBox("套¬¡Á接¨®字Á?
创ä¡ä建¡§失º¡ì败㨹!
ê?
");
returnfalse;
}
SOCKADDR_INsock_add;
sock_add.sin_family=AF_INET;
sock_add.sin_port=htons(5000);
sock_add.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
intm_bind;
m_bind=bind(m_socket,(SOCKADDR*)&sock_add,sizeof(SOCKADDR));
if(SOCKET_ERROR==m_bind)
{
AfxMessageBox("套¬¡Á接¨®字Á?
绑㨮定¡§失º¡ì败㨹!
ê?
");
closesocket(m_socket);
returnFALSE;
}
returnTRUE;
}
接收聊天内容线程:
DWORDWINAPIReceiveProc(LPVOIDlpParameter)
{
SOCKETsock=((RecStruct*)lpParameter)->m_Rsocket1;
HWNDhwd=((RecStruct*)lpParameter)->m_hWd1;
SOCKADDR_INrecAdd;
intlen=sizeof(SOCKADDR);
charrecBuf[500];
chartempBuf[600];
intrecvResult;
while(TRUE)
{
recvResult=recvfrom(sock,recBuf,500,0,(SOCKADDR*)&recAdd,&len);
if(SOCKET_ERROR==recvResult)
break;
sprintf(tempBuf,"%s说¦Ì:
êo\r\n%s",inet_ntoa(recAdd.sin_addr),recBuf);
:
:
PostMessage(hwd,WM_RECDATA,0,(LPARAM)tempBuf);
}
return0;
}
聊天内容发送按钮:
VoidCChatroomDlg:
:
OnBnClickedBtnSend()
{
DWORDm_IP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(m_IP);
SOCKADDR_INsendAdd;
sendAdd.sin_family=AF_INET;
sendAdd.sin_port=htons(5000);
sendAdd.sin_addr.S_un.S_addr=htonl(m_IP);
CStringsendStr;
CStringstr;
chartempStr[500];
CStringtempSendStr;
charhostName[50];
hostent*ht;
GetDlgItemText(DC_Edit_Send,sendStr);
GetDlgItemText(IDC_Edit_Receive,tempSendStr);
gethostname(hostName,50);
ht=gethostbyname(hostName);
sprintf(tempStr,"%s说¦Ì:
êo\r\n%s",inet_ntoa(*(structin_addr*)ht->h_addr_list[0]),sendStr);
str=tempStr;
str=tempSendStr+str;
str=str+"\r\n\r\n";
SetDlgItemText(IDC_Edit_Receive,str);
m_Edit_Recv.LineScroll(m_Edit_Recv.GetLineCount());
sendto(m_socket,sendStr,sendStr.GetLength()+1,0,(SOCKADDR*)&sendAdd,sizeof(SOCKADDR));
SetDlgItemText(DC_Edit_Send,"");
}
3.4运行结果
说明:
为了便于测试和观察,选择127.0.0.1的发送IP地址进行单机测试。
图3程序运行启动界面
双击打开Chatroom.exe可执行程序后的程序启动界面如图3所示,然后在“好友IP地址”栏中输入本地回送地址127.0.0.1准备进行与好友聊天。
图4用户输入将要发送的聊天内容
单击鼠标激活“发送内容”栏,用户在“发送内容”栏中输入自己想要发送的聊天内容。
演示结果如图4所示。
图5聊天室中聊天内容
当有聊天者在聊天室中发送聊天内容后,程序会接收到聊天内容,并在“聊天室”栏中显示自己发送的内容和接收到的内容(与QQ一样)。
由于该测试是用的本地回送IP,所以在“聊天室”栏中显示的第一条是自己发送出去的内容,第二条是自己接收到的内容。
4实验感想
通过独立完成了这次实验的全部内容,我对多线程网络编程有了更全面、深刻地认识和了解,尤其是对Windowssocket的掌握和编程应用。
由于我对MFC较为熟悉,所以在整个实验过程中,我采用MFC进行编程来实现这个多人聊天室的网络程序。
在程序实现之前,我通过网络上的基于socket网络编程资料和老师课上讲解的内容,认真全面地学习了Windowssocket的运行机制和其在网络编程上的应用方法。
在设计实现阶段,由于采用的是基于socket的UDP协议来进行聊天的通信,于是我直接使用的是基础SOCKET类。
编码过程中主要遇到的问题集中在多线程的合理高效启动和释放方面上,由于在之前的学习和开发中对多线程的掌握和应用不足,所以该实验的大部分时间和精力也花费在了这方面上。
最终的解决方案是采用了MFC封装优化的轻量级线程生成函数AfxBeginThread()来进行开发实现的。
从开始的学习、设计,到遇到问题、解决问题,再到最终的实现、完成,我独立地经历实现了这次实验,对互联网构软件编程技术的理解也不只是停留在理论层面上了,而是在实践开发层次上对其有了全新的认识和掌握。
在此,感谢老师课堂上详尽认真的讲解,使我对Internet程序的设计产生了浓厚的兴趣,我会继续努力,完成好后面的实验,提高自己的知识和技术水平。