基于TCP的聊天程序设计与开发.docx

上传人:b****3 文档编号:6324928 上传时间:2023-05-09 格式:DOCX 页数:12 大小:172.41KB
下载 相关 举报
基于TCP的聊天程序设计与开发.docx_第1页
第1页 / 共12页
基于TCP的聊天程序设计与开发.docx_第2页
第2页 / 共12页
基于TCP的聊天程序设计与开发.docx_第3页
第3页 / 共12页
基于TCP的聊天程序设计与开发.docx_第4页
第4页 / 共12页
基于TCP的聊天程序设计与开发.docx_第5页
第5页 / 共12页
基于TCP的聊天程序设计与开发.docx_第6页
第6页 / 共12页
基于TCP的聊天程序设计与开发.docx_第7页
第7页 / 共12页
基于TCP的聊天程序设计与开发.docx_第8页
第8页 / 共12页
基于TCP的聊天程序设计与开发.docx_第9页
第9页 / 共12页
基于TCP的聊天程序设计与开发.docx_第10页
第10页 / 共12页
基于TCP的聊天程序设计与开发.docx_第11页
第11页 / 共12页
基于TCP的聊天程序设计与开发.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于TCP的聊天程序设计与开发.docx

《基于TCP的聊天程序设计与开发.docx》由会员分享,可在线阅读,更多相关《基于TCP的聊天程序设计与开发.docx(12页珍藏版)》请在冰点文库上搜索。

基于TCP的聊天程序设计与开发.docx

基于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);

}

四.实验结果

客户端:

服务器端:

连接:

消息通信:

多用户连接:

断开连接:

五.实验问题

多用户连接时,到达最大连接数时,程序会出现问题,已连接的客户断开后,无法再连接上。

不同的客户聊天记录的信息应该显示不同,这个功能还没有做出来。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2