VC++课程设计报告报告_第1页
VC++课程设计报告报告_第2页
VC++课程设计报告报告_第3页
VC++课程设计报告报告_第4页
VC++课程设计报告报告_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z利用WindowsSocket编写程序实现客户机/效劳器端对端的聊天程序。1需求分析与开发环境1.1功能需求1、单个客户机和效劳器通过IP地址和端口号进展连接;2、承受客户端发送信息显示在一个列表框内;3、客户端和效劳器端可以交流信息,可以收发文件,效劳器端可实现监听;4、当效劳器停顿效劳,向每个连接客户端发送效劳终止通告;5、客户端需要会员登陆,会员数据保存在数据库中,登陆后才可进展聊天;6、在效劳器端添加了文件保存功能,管理员可以对聊天内容进展记录。1.2开发环境整个系统采用的是VisualC++6.0程序设计,数据库使用的是SQLServer2005数据库。程序的核心就是要利用WindowsSocket进展网络设计实现,使用CS构造。2数据库设计由于相对于数据库的要求比拟简单,只需要利用SQLServer2005创立一个数据库,其中创立一个login表存放管理员账户信息就可以了。数据表login信息为:用户名(Uname)、密码(Upw)。2.1数据库的使用ADO进展数据库设计,需要添加导入语句。*import"C:\ProgramFiles\monFiles\System\ado\msado15.dll"no_namespacerename("EOF","end")3各模块的设计3.1效劳器与客户端套接的实现3.1.1效劳器端:CMyServerSocket类主要功能:用于侦听,创立客户CMyServerSocket。主要成员函数:OnAccept〔intnErrorCode〕主要功能:重载父类OnAccept(intnErrorCode)用于在侦听后,承受客户端Connect()时自行调用的函数。构造函数:CMyServerSocket()功能:就是初始化类参数析构函数:~CMyServerSocket();保持默认MySocket类主要功能:对应每一个用户的套接口,实现承受功能。当然也实现发送功能(发送功能没有重载是因为在对话框类内进展了修改)。主要成员函数:OnReceive(intnErrorCode)和OnSend(intnErrorCode)主要功能:利用类向导重载MySocket的OnReceive(intnErrorCode)和OnSend(intnErrorCode)函数,把缓冲区内容一次发生完毕,在接收时需要把接收到的代码显示在对话框的编辑框内。构造函数:MySocket〔CServerDlg*pDlg〕功能:就是初始化类参数析构函数:~MySocket〔〕;保持默认3.1.2客户端:MySocket类主要功能:对应每一个用户的套接口,实现承受功能。当然也实现发送功能(发送功能没有重载是因为在对话框类内进展了修改)。主要成员函数:OnReceive(intnErrorCode)、OnSend(intnErrorCode),、OnConnect(intErrorCode)主要功能:利用类向导重载MySocket的OnReceive(intnErrorCode)和OnSend(intnErrorCode)函数,把缓冲区内容一次发生完毕,在接收时需要把接收到的代码显示在对话框的编辑框内。OnConnect(intErrorCode)设置连接信息。构造函数:MySocket〔CServerDlg*pDlg〕功能:就是初始化类参数析构函数:~MySocket〔〕;保持默认3.2效劳器端的实现效劳器端登陆,注册界面设计效劳器界面设计图为控件添加变量,控件ID及变量图3.2.1登录实现voidCDialog1::Onlogin(){UpdateData(true); CoInitialize(NULL); _ConnectionPtrpconnect(__uuidof(Connection)); _RecordsetPtrrecord(__uuidof(Recordset)); _mandPtrd(__uuidof(mand)); pconnect->ConnectionString="Provider=SQLOLEDB.1;IntegratedSecurity=SSPI;PersistSecurityInfo=False;InitialCatalog=user"; pconnect->Open(",",",NULL); d->put_ActiveConnection(_variant_t((IDispatch*)pconnect)); //标准SQL语句 CStringstr1; CStringcmd="select*fromloginwhere用户名='"; cmd+=m_name; cmd+="'and密码='"; str1.Format("%d",m_pass); cmd+=str1; cmd+="'"; d->mandTe*t=_bstr_t(cmd);//得到SQL语句 record=d->E*ecute(NULL,NULL,adCmdTe*t); if(!record->end){CTest1Dlgdlg;CTest1App*pApp=(CTest1App*)Af*GetApp();pApp->m_pMainWnd=&dlg;dlg.DoModal();}else {Af*MessageBo*("loginerror"); } record->Close(); pconnect->Close(); d.Release();record.Release(); pconnect.Release(); CoUninitialize();}注册的实现voidCDialog1::Onzhuce(){ UpdateData(true); CoInitialize(NULL); _ConnectionPtrpconnect(__uuidof(Connection)); _RecordsetPtrrecord(__uuidof(Recordset)); _mandPtrd(__uuidof(mand)); pconnect->ConnectionString="Provider=SQLOLEDB.1;IntegratedSecurity=SSPI;PersistSecurityInfo=False;InitialCatalog=user"; pconnect->Open(",",",NULL); d->put_ActiveConnection(_variant_t((IDispatch*)pconnect));CStringcmd="insertintologinvalues('"; cmd+=m_name; cmd+="','"; CStringstr2; str2.Format("%d",m_pass); cmd+=str2;cmd+="')"; d->mandTe*t=_bstr_t(cmd);if(m_name.IsEmpty()||str2.IsEmpty()) {Af*MessageBo*("请输入用户或者密码");return; }else { record=d->E*ecute(NULL,NULL,adCmdTe*t);//执行sql语句 } Af*MessageBo*("恭喜你,注册成功"); CDialog1::OnOK();return;record->Close();pconnect->Close();d.Release();record.Release();pconnect.Release();CoUninitialize();}3.2.2创立效劳器创立效劳器,客户端可以通过IP地址和端口号和效劳器进展连接,实现代码如下:voidCTest1Dlg::OnListen(){ Info.i=9; Info.pctrlProgress=&m_progress;CWinThread* pThread=Af*BeginThread(fun,&Info);UpdateData(true); if(!Af*SocketInit()) { Af*MessageBo*("IDP_SOCKETS_INIT_FAILED"); return; } BOOLflag=m_serversocket.Create(m_port); if(!flag) { Af*MessageBo*("SOCKETERROR"); return; } flag=m_serversocket.Listen(1); if(!flag) { Af*MessageBo*("SOCKETERROR"); return; } SetDlgItemTe*t(IDC_LISTEN,"正在监听");} 3.2.3发送按钮用于实现向客户端发送消息的功能实现代码如下:voidCTest1Dlg::OnSend(){ intilen; intisent; UpdateData(TRUE);SYSTEMTIMEstr;CStringstrTime;GetLocalTime(&str);strTime.Format("%2d:%2d:%2d",str.wHour,str.wMinute,str.wSecond); if(m_sendmsg!=") { ilen=m_sendmsg.GetLength(); isent=m_serversocket.m_socket->Send(LPCTSTR(m_sendmsg),ilen); if(isent==SOCKET_ERROR) { MessageBo*("连接失败,请重试!"); } else {m_msg+="效劳器:"+strTime+"发"+m_sendmsg; //m_msg+= Server_time; m_msg+="\r\n";m_sendmsg="; UpdateData(FALSE);} }}3.2.4效劳器退出voidCTest1Dlg::OnOK(){ //TODO:Adde*travalidationhere CDialog::OnOK();}3.3客户端的实现客户机聊天界面设计3.3.1连接按钮与效劳器的,连接成功可进展聊天操作。实现代码如下:voidCTestDlg::OnConnect(){ if(!Af*SocketInit()) { Af*MessageBo*("IDP_SOCKETS_INIT_FAILED"); return; } GetDlgItemTe*t(IDC_IPADDRESS1,m_ipstr); m_socket.m_hSocket=INVALID_SOCKET; UpdateData(true); BOOLflag=m_socket.Create(); if(!flag) { Af*MessageBo*("SOCKETERROR"); return; } m_socket.Connect(m_ipstr,m_port);}3.3.2发送按钮向效劳器发送消息,实现代码如下:voidCTestDlg::OnSend(){intilen;intisent;UpdateData(1);SYSTEMTIMEstr;CStringstrTime;GetLocalTime(&str);strTime.Format("%2d:%2d:%2d",str.wHour,str.wMinute,str.wSecond);if(m_msg!=""){ilen=m_msg.GetLength();isent=m_socket.Send(LPCTSTR(m_msg),ilen);if(isent==SOCKET_ERROR){MessageBo*("连接失败,请重试!");}else{m_recmsg+="客户机"+strTime+"发"+m_msg;m_recmsg+="\r\n";m_msg=";UpdateData(0);}} }4程序测试4.1效劳器端操作测试效劳器端登陆界面效劳器端注册界面翻开效劳器端进展监听实现聊天

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论