基于TCP的聊天程序设计与开发.docx
- 文档编号:11540473
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:12
- 大小:172.41KB
基于TCP的聊天程序设计与开发.docx
《基于TCP的聊天程序设计与开发.docx》由会员分享,可在线阅读,更多相关《基于TCP的聊天程序设计与开发.docx(12页珍藏版)》请在冰豆网上搜索。
基于TCP的聊天程序设计与开发
《基于TCP的聊天程序设计与开发》
实验指导
一.实验目的
通过设计网络协议及应用程序来加深理解网络各层的功能和机理,特别是对网络层、运输层、应用层的理解。
独立编写基于TCP的网络应用程序,独立上机调试程序,掌握基于TCP的网络应用基本技术。
培养独立思考问题、分析问题的能力和规范化工程设计的能力。
综合运用所学的知识去解决实践中的应用问题,掌握实验技能。
为以后的毕业设计与实际工作打下基础。
二.实验方式与基本要求
独立编写程序,独立上机调试程序,独立撰写实验报告
三.实验基本步骤
本试验采取分组进行协议设计,然后各自进行独立的完整的程序设计(包括概要设计与代码设计),然后互相通信。
(如果设计正确,这组程序的任何一个都应与其它程序是互通的)。
步骤1:
程序总体结构:
C/S结构。
C与S分开。
步骤2:
服务器S程序基本构成
S主进程初始化;例如
voidCServerSocket:
:
Start()
{
this->Create(1169);//创建端口进程
this->Listen();
}
主进程进入监听;例如
Listen();//开始监听
重载虚函数OnAccept,响应客户请求
voidCServerSocket:
:
OnAccept(intnErrorCode)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
SOCKADDRSockAddr;
inti=0;
while(i if(slave[i]==NULL){ slave[i]=newCServerSlaveSocket(dlg,this,i);//创建子进程 this->Accept(*slave[i],&SockAddr);//接受客户连接请求 dlg->SetForegroundWindow(); CStringidstr; idstr.Format("%d",i+1);//加上客户端编号 slave[i]->Send("连接成功啦^-^",13);//发送连接成功消息给客户 CStringc_IP; UINTc_Port; slave[i]->GetPeerName(c_IP,c_Port);//获取客户端IP和端口 CStringstrPort; strPort.Format("%d",c_Port); charhostStr[50];//添加客户信息 strcpy(hostStr,"客户"+idstr+"["+c_IP+": "+strPort+"]"); dlg->m_hostList.AddString(hostStr);//客户上线 break; } i++; } if(i==SLAVEMAX){ dlg->m_hostList.AddString("已超过最大连接数T_T"); } CSocket: : OnAccept(nErrorCode); } 释放一个连接 voidCServerSocket: : DeleteSlaveSocket(intid) { deleteslave[id];//////////////////////关闭子进程 slave[id]=NULL; } 从进程重载虚函数OnReceive,处理接收到的数据;例如 voidCServerSlaveSocket: : OnReceive(intnErrorCode) { //TODO: Addyourspecializedcodehereand/orcallthebaseclass charrbuf[256]; intn; n=this->Receive(rbuf,256);//////////////////接受消息 rbuf[n]='\0'; this->GetPeerName(c_IP,c_Port);/////////获取对方IP,端口 charbuf[512]={0}; strcpy(buf,"客户"+uid+": ");/////////////////////显示客户号 CTimett;//////加上发送时间 strcat(buf,tt.GetCurrentTime().Format("%H: %M: %S").GetBuffer(8)); strcat(buf,">\r\n"); dlg->m_show+=buf;////////////////// strcpy(buf,""); strcat(buf,rbuf); strcat(buf,"\r\n");////////////////////////显示收到的信息 dlg->m_show+=buf;////////////////// dlg->UpdateData(false); dlg->m_showCtrl.LineScroll(dlg->m_showCtrl.GetLineCount());//新消息总显示 CSocket: : OnReceive(nErrorCode); }由于要重载虚函数,所以,必须定义一个CSocket的派生类。 从进程重载虚函数OnClose,释放连接,关闭进程 voidCServerSlaveSocket: : OnClose(intnErrorCode) { //TODO: Addyourspecializedcodehereand/orcallthebaseclass m_using=false; //////////////删除连接客户///////////////////// dlg->m_hostList.DeleteString(dlg->m_hostList.FindString(-1,"客户"+uid)); this->Close();//对应客户端关闭 cs->DeleteSlaveSocket(m_id);//调用主进程的连接释放函数 CSocket: : OnClose(nErrorCode); } 向客户发送信息;例如 voidCServerDlg: : Onsend() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(); charsbuf[256]; m_send.GetWindowText(sbuf,256);//获取发送框的字符串 m_send.SetWindowText("");//编辑框置空 m_send.SetFocus();/////焦点返回编辑框 if(strlen(sbuf)! =0){ if(m_hostList.GetCurSel()==0){///////发送给所有连接上的客户 for(inti=0;i if(pserversocket->slave[i]! =NULL) pserversocket->slave[i]->SendMsg(sbuf); } } else///////////发送给选中的客户 pserversocket->slave[m_hostList.GetCurSel()-1]->SendMsg(sbuf); charbuf[512]={0}; strcpy(buf,"自己: "); CTimett;/////////////显示发送时间 strcat(buf,tt.GetCurrentTime().Format("%H: %M: %S").GetBuffer(8)); strcat(buf,">\r\n"); m_show+=buf;////////////////// strcpy(buf,""); strcat(buf,sbuf);strcat(buf,"\r\n");///////////显示发送内容 m_show+=buf;//////////////////// } UpdateData(false); m_showCtrl.LineScroll(m_showCtrl.GetLineCount());////////编辑框自动滚动 } 发送表情: voidCServerDlg: : OnSendMood() { //TODO: Addyourcontrolnotificationhandlercodehere CStringstr,data;/////////////////////插入表情 m_moodCtrl.GetLBText(m_moodCtrl.GetCurSel(),str); m_send.GetWindowText(data); m_send.SetWindowText(data+str); } 清屏: voidCServerDlg: : OnClearMsg()//清屏 { //TODO: Addyourcontrolnotificationhandlercodehere m_show=_T(""); UpdateData(false); } 步骤3: 客户C程序基本构成 创建TCP客户; voidCClientDlg: : Onconnect() { //TODO: Addyourcontrolnotificationhandlercodehere cc->Create(0);////////创建端口 if(cc->Connect(m_serverIP,1169))////////////////请求连接 { m_send.EnableWindow(true);//允许发送 m_connect.EnableWindow(false);//connect m_disconnect.EnableWindow(true);//disconnect } else { m_show+=_T("连接失败! T.T\r\n");/////////// UpdateData(false);//////////// m_showCtrl.LineScroll(m_showCtrl.GetLineCount());//////// cc->Close(); } return; } 向服务器(m_serverIP,1169)发送连接请求;例如 cc->Connect(m_serverIP,1169); 断开连接: voidCClientDlg: : Ondisconnect() { //TODO: Addyourcontrolnotificationhandlercodehere cc->Close();////////////////////////////////断开连接 m_show+=_T("断开连接! -.-\r\n");/////////// UpdateData(false);/////// m_showCtrl.LineScroll(m_showCtrl.GetLineCount());///// /////////////////////////////////////////////按钮不可用 m_send.EnableWindow(false);//send m_connect.EnableWindow(true);//connect m_disconnect.EnableWindow(false);//disconnect } 向服务器发送信息;例如 voidCClientDlg: : Onsend() { //TODO: Addyourcontrolnotificationhandlercodehere charsbuf[256]; m_senddata.GetWindowText(sbuf,256);//获取发送框的字符串 m_senddata.SetWindowText("");//编辑框置空 cc->Send(sbuf,strlen(sbuf));//发送信息 m_senddata.SetFocus();/////焦点返回编辑框 if(strlen(sbuf)! =0){//发送字符不为空 charbuf[512]={0}; strcpy(buf,"自己: ");//加上自己的标志 CTimett;//加上发送时间 strcat(buf,tt.GetCurrentTime().Format("%H: %M: %S").GetBuffer(8)); strcat(buf,">\r\n"); m_show+=buf; strcpy(buf,"");//显示自己发送的内容 strcat(buf,sbuf); strcat(buf,_T("\r\n")); m_show+=buf; UpdateData(false); m_showCtrl.LineScroll(m_showCtrl.GetLineCount());//新消息滚动 } } 发送表情: voidCClientDlg: : OnMood() { //TODO: Addyourcontrolnotificationhandlercodehere CStringstr,data;/////////////////////插入表情 m_moodCtrl.GetLBText(m_moodCtrl.GetCurSel(),str); m_senddata.GetWindowText(data); m_senddata.SetWindowText(data+str); } 重载虚函数OnReceive,处理接收到的数据;例如 voidCClientSocket: : OnReceive(intnErrorCode)//接收消息 { //TODO: Addyourspecializedcodehereand/orcallthebaseclass charrbuf[256]; intn; n=this->Receive(rbuf,256);//获取收到的消息字符串 rbuf[n]='\0'; charbuf[512]={0}; strcpy(buf,"服务器端: "); CTimett;//加上发送时间 strcat(buf,tt.GetCurrentTime().Format("%H: %M: %S").GetBuffer(8)); strcat(buf,">\r\n"); dlg->m_show+=buf; strcpy(buf,"");//显示收到的信息 strcat(buf,rbuf); strcat(buf,"\r\n"); dlg->m_show+=buf; dlg->UpdateData(false); dlg->m_showCtrl.LineScroll(dlg->m_showCtrl.GetLineCount());//新消息总显示 CSocket: : OnReceive(nErrorCode); } 清屏: voidCClientDlg: : OnClearMsg()///////////////////清屏 { //TODO: Addyourcontrolnotificationhandlercodehere m_show=_T(""); UpdateData(false); } 四.实验结果 客户端: 服务器端: 连接: 消息通信: 多用户连接: 断开连接: 五.实验问题 多用户连接时,到达最大连接数时,程序会出现问题,已连接的客户断开后,无法再连接上。 不同的客户聊天记录的信息应该显示不同,这个功能还没有做出来。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 TCP 聊天 程序设计 开发