聊天程序设计报告计算机网络Word文档格式.docx
- 文档编号:19836325
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:19
- 大小:877.43KB
聊天程序设计报告计算机网络Word文档格式.docx
《聊天程序设计报告计算机网络Word文档格式.docx》由会员分享,可在线阅读,更多相关《聊天程序设计报告计算机网络Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
CClientSocket*curr=Head;
while(curr&
&
who>
0)
{curr=curr->
who--;
curr->
以下是此程序的效果截图:
服务器端的效果截图
用户“xiaoQ”的登录界面
用户“xiaoQQ”的登录界面
功能描述
1、多人会话。
此程序分为服务器端和客户端,当客户端要进入聊天室的时候,就必须通过网络连接到服务端,以实现和其它客户端的通讯功能。
其中最简单的一种通讯方式就是多人会话,运用多线程同时对多个用户的信息进行监听,服务器通过转发消息,让所有人都可以得到消息,实现多人会话。
2、一对一会话。
此程序的服务器端除了能够提供多人会话的功能外,还提供了私人聊天功能,可以实现一对一的聊天。
就是在消息转发的时候,私聊的消息只发给私聊的对象,而其他人看不到此消息,但是此消息会通过服务器端转发,然后再到达目的客户端。
3、个性化的昵称。
为了区别用户,此程序还允许用户可以自定义个性化的昵称。
在用户登录的时候,用户可以为自己设定一个昵称,以便在多人会话的时候作为身份识别。
同时服务器端也会以此昵称作为客户端的登录身份,服务器管理员,同样也显示在其他用户的在线列表栏中。
4、服务器登陆。
服务器端开启之后处于监听状态,多线程工作,接受每一个用户的连接请求。
而客户端只需输入服务器端的IP地址即可,端口在服务器端自动生成。
设计步骤:
本聊天程序实现工具为VisualC++6.0MFC,主要利用其中用于网络编程的CSocket类实现网络通讯功能。
主要程序分为两部分:
1、服务器端,界面如下图所示:
主要代码如下所示:
(1)、CChatRoomServerDlg函数用来对服务器端进行初始化
voidCChatRoomServerDlg:
OnPaint()
{if(IsIconic())
{CPaintDCdc(this);
//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&
rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
dc.DrawIcon(x,y,m_hIcon);
else
{CDialog:
OnPaint();
HCURSORCChatRoomServerDlg:
OnQueryDragIcon()
{return(HCURSOR)m_hIcon;
//开始服务器按钮
OnButtonStart()
{m_IDC_BUTTON_START.EnableWindow(FALSE);
//让开启按钮失效
if(!
ListenSocket.Create(6767))//绑定端口
{AfxMessageBox("
绑定端口失败!
"
);
ListenSocket.Listen())//服务器侦听
侦听失败!
AfxMessageBox("
服务器开启成功!
CStringtTmep;
tTmep="
系统消息:
服务器已开启成功!
;
m_ChatList.AddString(tTmep);
m_IDC_BUTTON_STOP.EnableWindow(TRUE);
//恢复停止按钮}
OnButtonStop()
{m_IDC_BUTTON_STOP.EnableWindow(FALSE);
chars[30]="
聊天服务器停止工作了!
!
ListenSocket.CCSL.Sends(s,30);
//广播聊天服务器停止消息
CClientSocket*p=ListenSocket.CCSL.Head;
while(p)
{p->
Close();
ListenSocket.CCSL.Del(p);
//释放链表中的套接字
p=ListenSocket.CCSL.Head;
ListenSocket.Close();
m_USER.ResetContent();
//清楚服务器在线用户列表
m_IDC_BUTTON_START.EnableWindow(TRUE);
OnButtonSend()
{intn;
charmessage[1000];
UpdateData(TRUE);
if(m_IDC_BUTTON_MESSAGE=="
)
{MessageBox("
请输入消息!
"
提示"
MB_OK);
{m_IDC_BUTTON_MESSAGE="
服务器端说:
+m_IDC_BUTTON_MESSAGE;
n=m_IDC_BUTTON_MESSAGE.GetLength();
sprintf(message,"
%s"
m_IDC_BUTTON_MESSAGE.GetBuffer(n));
message[n]=0;
ListenSocket.CCSL.Sends(message,1000);
m_IDC_BUTTON_MESSAGE="
UpdateData(FALSE);
(2)、CClientSocket函数用于管理用户列表及会话
voidCClientSocket:
OnReceive(intnErrorCode)
{charbuff[1000];
charall_user[2000];
charname[20];
intn;
intm;
n=this->
Receive(buff,1000);
buff[n]=0;
charFlag[10];
for(inti=0;
i<
8;
i++)
{Flag[i]=buff[i];
Flag[8]=0;
CChatRoomServerApp*pApp=(CChatRoomServerApp*)AfxGetApp();
CChatRoomServerDlg*pDlg=(CChatRoomServerDlg*)pApp->
m_pMainWnd;
if(strcmp(Flag,"
NEW_USER"
)==0)
{CStringsTemp;
for(i=9;
buff[i]!
=0;
{buff[i-9]=buff[i];
buff[i-9]=0;
sTemp.Format("
buff);
pDlg->
m_USER.AddString(sTemp);
m=pDlg->
m_USER.GetCount();
strcpy(all_user,"
USERLIST"
for(i=0;
m;
{pDlg->
m_USER.GetText(i,name);
strcat(all_user,name);
strcat(all_user,"
|"
strcat(buff,"
进入聊天室"
List->
Sends(all_user,strlen(all_user));
{if(strcmp(Flag,"
CLOSEUSE"
{CStringsTemp;
for(i=9;
{buff[i-9]=buff[i];
buff[i-9]=0;
sTemp.Format("
//离线用户昵称
m=pDlg->
for(i=0;
{pDlg->
if(strcmp(name,buff)==0)
{pDlg->
m_USER.DeleteString(i);
}
//将新的在线用户昵称名单发给所有用户
strcpy(all_user,"
strcat(all_user,name);
strcat(all_user,"
strcat(buff,"
离开聊天室!
List->
Del(this);
elseif(strcmp(Flag,"
PrivChat"
)==0)//私聊
='
|'
for(intk=i+1;
buff[k]!
k++)
{buff[k-i-1]=buff[k];
buff[k-i-1]=0;
if(strcmp(name,sTemp)==0)
{List->
OnlySend(buff,strlen(buff),i);
}}
else
{List->
Sends(buff,n);
//将聊天信息群发给所有用户}
}
CStringsTemp;
sTemp.Format("
收到:
pDlg->
m_ChatList.AddString(sTemp);
m_ChatList.SetTopIndex(pDlg->
m_ChatList.GetCount()-1);
CSocket:
OnReceive(nErrorCode);
(3)、一下代码用于设定用户的多人会话与一对一会话
Add(CClientSocket*add)
{CClientSocket*tmp=Head;
Head)
{Head=add;
returnfalse;
while(tmp->
Next)
{tmp=tmp->
tmp->
Next=add;
//从链表队列中删除Socket
Del(CClientSocket*d)
{CClientSocket*p1=Head;
CClientSocket*p2;
{returnfalse;
if(Head==d)
{Head=p1->
p1->
deletep1;
returntrue;
for(;
p1->
Next!
=NULL;
p1=p1->
{if(p1->
Next==d)
{p2=p1->
p1->
Next=p2->
p2->
deletep2;
returntrue;
}}
returnfalse;
//向所有用户发送消息
//仅仅向私聊用户who发送信息
1、客户端,截图如下所示:
主要代码:
voidCChatRoomDlg:
OnConnectButton()//连接聊天室服务器
{//TODO:
Addyourcontrolnotificationhandlercodehere
char*nikename;
char*address;
myServerSocket->
Create())
{myServerSocket->
AfxMessageBox("
网络创建错误!
return;
n=m_IDC_EDIT_ADDRESS.GetLength();
address=newchar(n+1);
sprintf(address,"
m_IDC_EDIT_ADDRESS.GetBuffer(n));
address[n]=0;
n=m_IDC_EDIT_NIKENAME.GetLength();
nikename=newchar(n+1);
sprintf(nikename,"
m_IDC_EDIT_NIKENAME.GetBuffer(n));
nikename[n]=0;
Connect(address,6767))
网络连接错误,请检查服务器地址。
return;
m_BNSend.EnableWindow(TRUE);
m_BNExit.EnableWindow(TRUE);
myServerSocket->
NikeName=nikename;
//发送新用户昵称
charmessage2[20];
strcpy(message2,"
NEW_USER|"
strcat(message2,myServerSocket->
NikeName);
if(myServerSocket->
Send(message2,20))//——————————连接聊天室服务器
连接成功!
网络传输错误!
OnSendButton()
CStringto_name;
if(m_IDC_EDIT_MESSAGE=="
请输入要发送的消息!
{if(m_SL==TRUE)//私聊
{if(m_USER.GetCurSel()>
=0)
{m_USER.GetText(m_USER.GetCurSel(),to_name);
m_IDC_EDIT_MESSAGE=myServerSocket->
NikeName+"
悄悄对"
+to_name+"
说:
+m_IDC_EDIT_MESSAGE;
m_ChatList.AddString(m_IDC_EDIT_MESSAGE);
m_IDC_EDIT_MESSAGE="
PrivChat|"
n=m_IDC_EDIT_MESSAGE.GetLength();
sprintf(message,"
m_IDC_EDIT_MESSAGE.GetBuffer(n));
message[n]=0;
else
{AfxMessageBox("
没有私聊对象!
return;
{m_IDC_EDIT_MESSAGE=myServerSocket->
对大家说:
n=m_IDC_EDIT_MESSAGE.GetLength();
sprintf(message,"
message[n]=0;
if(myServerSocket->
Send(message,n+1))
{m_IDC_EDIT_MESSAGE="
UpdateData(FALSE);
{AfxMessageBox("
}}}
OnExitButton()
CLOSEUSE|"
Send(message2,20))//————————离开聊天室
{}
CDialog:
OnOK();
BOOLCChatRoomDlg:
GetMessage()//显示聊天信息
{charbuff[2000];
intcount;
count=myServerSocket->
Receive(buff,2000);
buff[count]=0;
Flag[8]=0;
if(strcmp(Flag,"
)==0)//新用户昵称列表
{m_USER.ResetContent();
//清空列表
CStringsTemp;
intj=8;
for(i=8;
{if(buff[i]=='
)//昵称分隔符号
{for(intm=0;
j<
i;
j++,m++)
{name[m]=buff[j];
name[m]='
\0'
sTemp.Format("
name);
//昵称
m_USER.AddString(sTemp);
j=i+1;
}}}
else//聊天信息
{m_ChatList.AddString(buff);
设计使用说明:
此聊天程序的实现主要通过两部分实现,一个是客户端,一个是服务器端。
服务器端可开启服务,等待用户登录,实现消息的中转发送;
客户端可以
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 聊天程序设计报告 计算机网络 聊天 程序设计 报告