基于TCP的聊天程序设计与开发剖析Word格式.docx
- 文档编号:19274881
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:12
- 大小:166.08KB
基于TCP的聊天程序设计与开发剖析Word格式.docx
《基于TCP的聊天程序设计与开发剖析Word格式.docx》由会员分享,可在线阅读,更多相关《基于TCP的聊天程序设计与开发剖析Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
{
this->
Create(1169);
//创建端口进程
Listen();
}
主进程进入监听;
//开始监听
重载虚函数OnAccept,响应客户请求
OnAccept(intnErrorCode)
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
SOCKADDRSockAddr;
inti=0;
while(i<
SLAVEMAX){
if(slave[i]==NULL){
slave[i]=newCServerSlaveSocket(dlg,this,i);
//创建子进程
Accept(*slave[i],&
SockAddr);
//接受客户连接请求
dlg->
SetForegroundWindow();
CStringidstr;
idstr.Format("
%d"
i+1);
//加上客户端编号
slave[i]->
Send("
连接成功啦^-^"
13);
//发送连接成功消息给客户
CStringc_IP;
UINTc_Port;
GetPeerName(c_IP,c_Port);
//获取客户端IP和端口
CStringstrPort;
strPort.Format("
c_Port);
charhostStr[50];
//添加客户信息
strcpy(hostStr,"
客户"
+idstr+"
["
+c_IP+"
"
+strPort+"
]"
);
m_hostList.AddString(hostStr);
//客户上线
break;
i++;
if(i==SLAVEMAX){
m_hostList.AddString("
已超过最大连接数T_T"
CSocket:
OnAccept(nErrorCode);
释放一个连接
DeleteSlaveSocket(intid)
deleteslave[id];
//////////////////////关闭子进程
slave[id]=NULL;
从进程重载虚函数OnReceive,处理接收到的数据;
voidCServerSlaveSocket:
OnReceive(intnErrorCode)
charrbuf[256];
intn;
n=this->
Receive(rbuf,256);
//////////////////接受消息
rbuf[n]='
\0'
;
/////////获取对方IP,端口
charbuf[512]={0};
strcpy(buf,"
+uid+"
"
/////////////////////显示客户号
CTimett;
//////加上发送时间
strcat(buf,tt.GetCurrentTime().Format("
%H:
%M:
%S"
).GetBuffer(8));
strcat(buf,"
>
\r\n"
m_show+=buf;
//////////////////
strcat(buf,rbuf);
////////////////////////显示收到的信息
UpdateData(false);
m_showCtrl.LineScroll(dlg->
m_showCtrl.GetLineCount());
//新消息总显示
OnReceive(nErrorCode);
}由于要重载虚函数,所以,必须定义一个CSocket的派生类。
从进程重载虚函数OnClose,释放连接,关闭进程
OnClose(intnErrorCode)
m_using=false;
//////////////删除连接客户/////////////////////
m_hostList.DeleteString(dlg->
m_hostList.FindString(-1,"
+uid));
Close();
//对应客户端关闭
cs->
DeleteSlaveSocket(m_id);
//调用主进程的连接释放函数
OnClose(nErrorCode);
向客户发送信息;
voidCServerDlg:
Onsend()
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<
SLAVEMAX;
i++){
if(pserversocket->
slave[i]!
=NULL)
pserversocket->
SendMsg(sbuf);
else///////////发送给选中的客户
slave[m_hostList.GetCurSel()-1]->
自己:
/////////////显示发送时间
strcat(buf,sbuf);
///////////显示发送内容
////////////////////
m_showCtrl.LineScroll(m_showCtrl.GetLineCount());
////////编辑框自动滚动
发送表情:
OnSendMood()
CStringstr,data;
/////////////////////插入表情
m_moodCtrl.GetLBText(m_moodCtrl.GetCurSel(),str);
m_send.GetWindowText(data);
m_send.SetWindowText(data+str);
清屏:
OnClearMsg()//清屏
m_show=_T("
步骤3:
客户C程序基本构成
创建TCP客户;
voidCClientDlg:
Onconnect()
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"
///////////
////////////
////////
return;
向服务器(m_serverIP,1169)发送连接请求;
Connect(m_serverIP,1169);
断开连接:
Ondisconnect()
////////////////////////////////断开连接
断开连接!
-.-\r\n"
///////
/////
/////////////////////////////////////////////按钮不可用
m_send.EnableWindow(false);
//send
m_connect.EnableWindow(true);
m_disconnect.EnableWindow(false);
向服务器发送信息;
m_senddata.GetWindowText(sbuf,256);
m_senddata.SetWindowText("
Send(sbuf,strlen(sbuf));
//发送信息
m_senddata.SetFocus();
/////焦点返回编辑框
=0){//发送字符不为空
//加上自己的标志
//加上发送时间
//显示自己发送的内容
strcat(buf,_T("
));
//新消息滚动
OnMood()
m_senddata.GetWindowText(data);
m_senddata.SetWindowText(data+str);
重载虚函数OnReceive,处理接收到的数据;
voidCClientSocket:
OnReceive(intnErrorCode)//接收消息
//获取收到的消息字符串
rbuf[n]='
服务器端:
//加上发送时间
//显示收到的信息
OnClearMsg()///////////////////清屏
m_show=_T("
四.实验结果
客户端:
服务器端:
连接:
消息通信:
多用户连接:
五.实验问题
多用户连接时,到达最大连接数时,程序会出现问题,已连接的客户断开后,无法再连接上。
不同的客户聊天记录的信息应该显示不同,这个功能还没有做出来。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 TCP 聊天 程序设计 开发 剖析