基于TCP的聊天程序设计与开发_第1页
基于TCP的聊天程序设计与开发_第2页
基于TCP的聊天程序设计与开发_第3页
基于TCP的聊天程序设计与开发_第4页
基于TCP的聊天程序设计与开发_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、基于TCP的聊天程序设计与开发实验指导一 实验目的通过设计网络协议及应用程序来加深理解网络各层的功能和机理,特别是对网络层、运输层、应用层的理解。独立编写基于TCP的网络应用程序,独立上机调试程序,掌握基于TCP的网络应用基本技术。培养独立思考问题、分析问题的能力和规范化工程设计的能力。综合运用所学的知识去解决实践中的应用问题,掌握实验技能。为以后的毕业设计与实际工作打下基础。二 实验方式与基本要求独立编写程序,独立上机调试程序,独立撰写实验报告三 实验基本步骤本试验采取分组进行协议设计,然后各自进行独立的完整的程序设计(包括概要设计与代码设计),然后互相通信。(如果设计正确,这组程序的任何一

2、个都应与其它程序是互通的)。步骤1: 程序总体结构:C/S结构。C与S分开。步骤2:服务器S程序基本构成S主进程初始化;例如void CServerSocket:Start()this->Create(1169); /创建端口进程this->Listen();主进程进入监听;例如Listen();/开始监听重载虚函数OnAccept,响应客户请求void CServerSocket:OnAccept(int nErrorCode) / TODO: Add your specialized code here and/or call the base classSOCKADDR So

3、ckAddr;int i=0;while(i<SLAVEMAX)if(slavei=NULL)slavei = new CServerSlaveSocket(dlg,this,i);/创建子进程this->Accept(*slavei,&SockAddr);/接受客户连接请求dlg->SetForegroundWindow();CString idstr;idstr.Format("%d",i+1);/加上客户端编号slavei->Send("连接成功啦-",13);/发送连接成功消息给客户CString c_IP;UIN

4、T c_Port;slavei->GetPeerName(c_IP,c_Port);/获取客户端IP和端口CString strPort;strPort.Format( "%d",c_Port);char hostStr50;/添加客户信息strcpy(hostStr,"客户"+idstr+""+c_IP+":"+strPort+"");dlg->m_hostList.AddString(hostStr);/客户上线break;i+;if(i=SLAVEMAX)dlg->m_h

5、ostList.AddString("已超过最大连接数T_T");CSocket:OnAccept(nErrorCode);释放一个连接void CServerSocket:DeleteSlaveSocket(int id)delete slaveid;/关闭子进程slaveid = NULL;从进程重载虚函数OnReceive,处理接收到的数据;例如void CServerSlaveSocket:OnReceive(int nErrorCode) / TODO: Add your specialized code here and/or call the base cla

6、sschar rbuf256;int n;n = this->Receive(rbuf,256);/接受消息rbufn = '0'this->GetPeerName(c_IP,c_Port);/获取对方IP,端口char buf512=0;strcpy(buf,"客户"+uid+": ");/显示客户号CTime tt; /加上发送时间strcat(buf,tt.GetCurrentTime().Format("%H:%M:%S").GetBuffer(8);strcat(buf," >rn

7、");dlg->m_show += buf;/strcpy(buf," ");strcat(buf,rbuf);strcat(buf,"rn");/显示收到的信息dlg->m_show += buf;/dlg->UpdateData(false);dlg->m_showCtrl.LineScroll(dlg->m_showCtrl.GetLineCount();/新消息总显示CSocket:OnReceive(nErrorCode);由于要重载虚函数,所以,必须定义一个CSocket的派生类。从进程重载虚函数OnC

8、lose,释放连接,关闭进程void CServerSlaveSocket:OnClose(int nErrorCode) / TODO: Add your specialized code here and/or call the base classm_using = false;/删除连接客户/dlg->m_hostList.DeleteString(dlg->m_hostList.FindString(-1,"客户"+uid);this->Close();/对应客户端关闭cs->DeleteSlaveSocket(m_id);/ 调用主进程的

9、连接释放函数CSocket:OnClose(nErrorCode);向客户发送信息;例如void CServerDlg:Onsend() / TODO: Add your control notification handler code hereUpdateData();char sbuf256;m_send.GetWindowText(sbuf,256);/获取发送框的字符串m_send.SetWindowText(""); /编辑框置空m_send.SetFocus(); /焦点返回编辑框if(strlen(sbuf)!=0) if(m_hostList.GetCur

10、Sel()=0)/发送给所有连接上的客户for(int i=0;i<SLAVEMAX;i+)if(pserversocket->slavei!=NULL)pserversocket->slavei->SendMsg(sbuf);else /发送给选中的客户pserversocket->slavem_hostList.GetCurSel()-1->SendMsg(sbuf);char buf512=0;strcpy(buf,"自己: ");CTime tt; /显示发送时间strcat(buf,tt.GetCurrentTime().For

11、mat("%H:%M:%S").GetBuffer(8);strcat(buf," >rn");m_show += buf;/strcpy(buf," ");strcat(buf,sbuf);strcat(buf,"rn");/显示发送内容m_show += buf;/UpdateData(false);m_showCtrl.LineScroll(m_showCtrl.GetLineCount();/编辑框自动滚动发送表情:void CServerDlg:OnSendMood() / TODO: Add yo

12、ur control notification handler code hereCString str,data;/插入表情m_moodCtrl.GetLBText(m_moodCtrl.GetCurSel(),str);m_send.GetWindowText(data);m_send.SetWindowText(data+str);清屏:void CServerDlg:OnClearMsg() /清屏/ TODO: Add your control notification handler code herem_show=_T("");UpdateData(false

13、);步骤3:客户C程序基本构成创建TCP客户; void CClientDlg:Onconnect() / TODO: Add your control notification handler code herecc->Create(0); /创建端口if(cc->Connect(m_serverIP,1169)/请求连接m_send.EnableWindow(true);/允许发送m_connect.EnableWindow(false);/connectm_disconnect.EnableWindow(true);/disconnectelsem_show += _T(&q

14、uot;连接失败!T.Trn");/UpdateData(false);/m_showCtrl.LineScroll(m_showCtrl.GetLineCount();/cc->Close();return;向服务器(m_serverIP,1169)发送连接请求;例如cc->Connect(m_serverIP,1169);断开连接:void CClientDlg:Ondisconnect() / TODO: Add your control notification handler code herecc->Close();/断开连接m_show += _T(&

15、quot;断开连接!-.-rn");/UpdateData(false);/m_showCtrl.LineScroll(m_showCtrl.GetLineCount();/按钮不可用m_send.EnableWindow(false);/sendm_connect.EnableWindow(true);/connectm_disconnect.EnableWindow(false);/disconnect向服务器发送信息;例如void CClientDlg:Onsend() / TODO: Add your control notification handler code her

16、echar sbuf256;m_senddata.GetWindowText(sbuf,256);/获取发送框的字符串m_senddata.SetWindowText(""); /编辑框置空cc->Send(sbuf,strlen(sbuf); /发送信息m_senddata.SetFocus();/焦点返回编辑框if(strlen(sbuf)!=0) /发送字符不为空char buf512=0;strcpy(buf,"自己: "); /加上自己的标志CTime tt; /加上发送时间 strcat(buf,tt.GetCurrentTime().

17、Format("%H:%M:%S").GetBuffer(8);strcat(buf," >rn");m_show += buf;strcpy(buf," "); /显示自己发送的内容strcat(buf,sbuf);strcat(buf,_T("rn");m_show += buf;UpdateData(false);m_showCtrl.LineScroll(m_showCtrl.GetLineCount();/新消息滚动发送表情:void CClientDlg:OnMood() / TODO: Add

18、your control notification handler code hereCString str,data;/插入表情m_moodCtrl.GetLBText(m_moodCtrl.GetCurSel(),str);m_senddata.GetWindowText(data);m_senddata.SetWindowText(data+str);重载虚函数OnReceive,处理接收到的数据;例如void CClientSocket:OnReceive(int nErrorCode) /接收消息/ TODO: Add your specialized code here and/or call the base classchar rbuf256;int n;n = this->Receive(rbuf,256); /获取收到的消息字符串rbufn='0'char buf512=0;strcpy(buf,"服务器端: ");CTim

温馨提示

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

评论

0/150

提交评论