网络聊天系统实验报告.docx

上传人:b****2 文档编号:25756714 上传时间:2023-06-12 格式:DOCX 页数:21 大小:1.06MB
下载 相关 举报
网络聊天系统实验报告.docx_第1页
第1页 / 共21页
网络聊天系统实验报告.docx_第2页
第2页 / 共21页
网络聊天系统实验报告.docx_第3页
第3页 / 共21页
网络聊天系统实验报告.docx_第4页
第4页 / 共21页
网络聊天系统实验报告.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

网络聊天系统实验报告.docx

《网络聊天系统实验报告.docx》由会员分享,可在线阅读,更多相关《网络聊天系统实验报告.docx(21页珍藏版)》请在冰豆网上搜索。

网络聊天系统实验报告.docx

网络聊天系统实验报告

网络聊天系统实验报告

1.功能介绍

(1)本程序的主界面截图及介绍

本程序的风格是清新明亮,代表着健康向上,偏向于为年轻人设计。

主色调是蓝色,与白色搭配,有一种天马行空的感觉。

让人时刻感受着蓝天白云,使使用者不会因为长久对着这个界面而感到厌倦。

本程序是用MFC的单文档模式,支持SOCKET。

集服务器与客户端于一身,既可用来当服务器,也可当客户端来连接服务器,并且不影响相互之间的功能。

标题栏上显示着本软件的名称:

NN聊天器。

NN是本人象征,聊天器是本软件功能的代名词。

如图:

 

标题栏下是菜单栏,其上有:

开始、结束、设置、文件、查看、帮助。

它们的快捷键分别为:

Ctrl+B,Ctrl+O,Ctrl+T,Ctrl+W,Ctrl+V,Ctrl+H。

它们的功能下文会详细介绍。

如图:

 

菜单栏下是工具栏,有7个图标,单击它们都能实现一个功能;从左到右分别是用于创建服务器,连接服务器,关闭服务器,退出服务器,复制,传输文件,帮助。

如图:

 

工具栏下左边的大片空白区域是显示聊天记录、系统信息、用户信息、用户表情等等文字和图片信息的地方,用户相互之间聊天,聊天的内容就是都显示在这上面的。

它是RichEdit控件,嵌在FORM的对话框上,使用“视”来显示这个控件。

如图:

 

 

工具栏下右边的长方形,是ListControl控件嵌在FORM的对话框中。

在这个控件中,有N行两列,第一列按行显示每个用户的头像,

第二列按行显示对应头像的用户昵称。

如右图示:

 

在信息区下就是用户的操作区,是一个对话框,有许多控件,其上有:

对象:

组合框控件,显示“所有人“和新加入的聊天用户,可以选择你要发送消息的对象。

动作:

组合框控件,显示各种动作,选择一种动作,发送消息时,就会显示相应动作的文字信息。

悄悄话:

CheckBox控件,如果你选择了这个单选框,那么你给谁发送的消息其他人就看不到了,也就是私聊功能。

图片表情:

按钮控件,如果你在“添加图片表情“那选择了一个图片表情,那么这个控件上就会显示相应的图片表情。

添加图片表情:

按钮控件,如果你要发送图片,就点击一下你要发送的图片,如果不要就点击“无“这个按钮。

发送:

按钮控件,如果要发送消息就单击这个按钮。

制作信息:

关于本人的信息。

如图示:

 

在往下就是状态栏:

从左到到右依次是:

状态,在线人数,本人相关信息。

如图示:

(2)分界面截图及介绍

①、菜单栏和工具栏

 

(注:

以下的菜单均有快捷键,可看截图来记住)

菜单栏:

开始

 

这个菜单有三个子菜单,其功能分别是:

创建服务器:

创建一个服务器,用于接听客户端的连接信息。

连接服务器:

连接服务器,如果成功就可以发送和接收服务器的消息,进行聊天。

复制:

复制聊天聊天的内容。

菜单栏:

结束

 

这个菜单有三个子菜单,其功能分别是:

关闭服务器:

这一项只有在建立了服务器后才有效,用于关闭服务器。

退出聊天室:

这一项只有你是当客户端连接了一个服务器后才有效,用于断开与服务器的连接。

关闭程序:

退出这个程序。

菜单栏:

设置

 

这个菜单有5个子菜单,其功能分别是:

清屏:

清楚所有显示的聊天内容,还你一个空白的区域。

改名:

可以更改你的昵称,而不用退出程序或断开重连。

屏蔽一个人:

如果有一个人实在讨厌,你不愿意见到他或她发的任何消息和内容,那么你可以用这个功能把他或她屏蔽了,你将见不到他或她发的任何消息和内容。

保存聊天记录:

如果你觉的聊天内容有价值,你可以用这个功能保存下来。

载入聊天记录:

如果你想看看以前的聊天记录,你可以用这个功能把以前的记录载入到显示屏。

菜单栏:

文件

 

这个菜单有一个子菜单,其功能是:

传输文件:

如果你有文件要发给好友,那么你可以有这个功能来实现。

菜单栏:

查看

 

这个菜单有两个子菜单,其功能是:

工具栏:

选择后工具栏消失,如再选择则重新出现。

状态栏:

选择后状态栏消失,如再选择则重新出现。

 

菜单栏:

帮助

 

这个菜单有一个子菜单,其功能是:

关于Chat:

选择后跳出一个对话框,显示关于本软件的一些信息。

 

工具栏:

创建服务器

与菜单栏的开始—创建服务器相联系。

工具栏:

连接服务器

与菜单栏的开始—连接服务器相联系。

工具栏:

关闭服务器

与菜单栏的结束—关闭服务器相联系。

工具栏:

退出服务器

与菜单栏的结束—退出服务器相联系。

工具栏:

复制

与菜单栏的开始—复制相联系。

工具栏:

传输文件

与菜单栏的文件—传输文件相联系。

工具栏:

关于

 

与菜单栏的关于—关于Chat相联系。

②、创建服务器界面

单击创建服务器跳出的对话框:

可以输入昵称、端口号,也可以选择头像。

创建客户端界面

单击连接服务器跳出的对话框:

可以输入昵称、你要连接的服务器的IP、服务器的端口号、你要选择的头像。

更改昵称界面

单击改名菜单跳出的对话框:

输入新昵称按确定便可以实现功能。

保存聊天记录界面

单击保存聊天记录跳出的对话框:

可以输入你自己想要的名字保存为txt文件。

载入聊天记录界面

单击载入聊天记录跳出的对话框:

可以输入你自己想要找的名字载入txt文件。

传输文件界面

单击传输文件跳出的对话框:

可以单击选择文件,来选择一个文件传输。

接受文件界面

如果有文件传输过来自动跳出的对话框:

可以单击接受文件,来选择一个地方保存传输过来的文件。

关于Chat界面

单击菜单关于Chat跳出的对话框:

显示版本信息,制作信息,和一些说明。

③、用户操作界面及介绍

对象:

选择要聊天或发送信息文件的对象

动作:

选择聊天时要用文字表达的动作

悄悄话:

选择秘密聊天,不让别人看见

添加图片表情:

选择聊天时所要发送的图片

表情。

 

文字输入框:

输入你要说的话。

图片表情:

显示马上要发送的图片表情。

 

发送:

发送你要说的话和做的表情按这个按钮。

本人的相关信息

2.创作过程

在一开始时我觉的聊天系统很简单,准备把它和五字棋结合起来。

所以我的设计方案就是在可能的情况下结合五子棋和聊天系统。

开始制作后,我选择的是用对话框作为主界面。

可是随着制作的深入和了解到的知识越来越多,我感觉到结合五子棋和聊天系统,只会使两个程序都处于低级状态,无法提高,所以我决定专攻聊天系统。

当我的聊天系统成型后,我发现用对话框做的聊天室很难在有提高和升级的潜力。

为了得到更多的锻炼,我毅然放弃了已成型的对话框聊天系统,开始向单文档的视图界面进发。

经过几个不眠不休的夜晚,我终于做出了现在的这个程序。

它还有很多发展潜力,可是由于时间的原因,我只能把最重要的功能完成了。

其他功能是不一定必须的,可是可以扩展,这是本程序的特点之一。

3.本程序的优点

(1)界面优美

(2)使用方便

(3)运行快速

(4)功能多样

以下是本人的得意代码:

1.这一段代码实现了本程序窗口分割,使本程序的几个“视“显示的恰到好处。

BOOLCMainFrame:

:

OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext)

{

RECTwndRect;

GetDesktopWindow()->GetWindowRect(&wndRect);

if(m_wndSplitter1.CreateStatic(this,2,1)==NULL)returnFALSE;

m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(CBottomView),CSize(0,0),pContext);

if(m_wndSplitter2.CreateStatic(&m_wndSplitter1,1,2,WS_CHILD|WS_VISIBLE,m_wndSplitter1.IdFromRowCol(0,0))==NULL)returnFALSE;

m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CRightView),CSize(0,0),pContext);

m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CChatView),CSize(wndRect.right-150,0),pContext);

m_wndSplitter1.SetRowInfo(0,wndRect.bottom-230,0);

SetActiveView((CBottomView*)m_wndSplitter1.GetPane(1,0));

returnTRUE;

}

2.这一段是聊天系统中最常用的一种消息传送函数,版本很多,不过我仍然觉的我写的这个函数很好,毕竟我的消息发送都靠它的。

voidCMsg:

:

Serialize(CArchive&ar)

{

if(ar.IsStoring())

{

ar<

ar<

ar<

ar<

ar<

ar<

ar<

ar<

}

else

{

ar>>command;

ar>>m_strFrom;

ar>>m_strTo;

ar>>m_strSay;

ar>>m_IP;

ar>>m_strFace;

ar>>m_strHead;

ar>>oneface;

}

m_strUserList.Serialize(ar);

m_strHeadList.Serialize(ar);

}

3.这一段代码我在对话框上加载了超过30张的位图,还不错的函数。

voidCBottomView:

:

OnInitialUpdate()

{

GetDlgItem(IDC_EDIT_MSG)->SetFocus();

CFormView:

:

OnInitialUpdate();

m_cmbObject.SetCurSel(0);

m_cmbFace.SetCurSel(0);

//

CBitmapbitmap;

bitmap.LoadBitmap(IDB_SEND);

HBITMAPhbitmap=(HBITMAP)bitmap.Detach();

CButton*pbutton=(CButton*)GetDlgItem(ID_FASONG);

pbutton->SetBitmap(hbitmap);

//

bitmap.LoadBitmap(IDB_WU);

hbitmap=(HBITMAP)bitmap.Detach();

pbutton=(CButton*)GetDlgItem(IDC_ONLYFACE);

pbutton->SetBitmap(hbitmap);

//

bitmap.LoadBitmap(IDB_WU);

hbitmap=(HBITMAP)bitmap.Detach();

pbutton=(CButton*)GetDlgItem(IDC_WUFACE);

pbutton->SetBitmap(hbitmap);

//

inti;

bfacetemp=-1;

for(i=0;i<26;i++)

{

CBitmapbitmap;

bitmap.LoadBitmap(IDB_BITMAP1+i);

HBITMAPhbitmap=(HBITMAP)bitmap.Detach();

CButton*pbutton=(CButton*)GetDlgItem(IDC_BUTTON1+i);

pbutton->SetBitmap(hbitmap);

}

}

4.这段代码使我可以设置RichEdit上显示文字的颜色,我觉的很有用。

voidCAutoRich:

:

SeletColor(COLORREFclr)

{

CHARFORMATcf=GetCharFormat();

if(cf.dwEffects&CFE_AUTOCOLOR)cf.dwEffects-=CFE_AUTOCOLOR;

cf.crTextColor=clr;

cf.dwMask=CFM_COLOR;

SetSelectionCharFormat(cf);

}

5.以下四个函数虽然简单,可是功能却是大的可怕,没有他们程序动不了。

SetDialogBkColor(RGB(157,199,253),RGB(255,255,255));//设置对话框的背景和字的颜色。

CoInitialize(NULL);//在RichEdit中加载位图是必须的函数

CoUninitialize();//上个函数的释放函数

AfxInitRichEdit();//显示带有RichEdit的对话框必须的函数

6.实现对话框上定义字的背景色和字的颜色

voidCTransparent:

:

OnPaint()

{

CPaintDCdc(this);//devicecontextforpainting

CRectrect;

GetClientRect(rect);

CStringstr;

GetWindowText(str);

CFont*font,*oldfont;

font=GetFont();

oldfont=dc.SelectObject(font);

dc.SetTextColor(RGB(255,255,255));

dc.SetBkMode(TRANSPARENT);

dc.DrawText(str,rect,0);

dc.SelectObject(oldfont);

//DonotcallCStatic:

:

OnPaint()forpaintingmessages

}

7.文件结构体,个人认为很重要

structSOCKET_FILE_INFO

{

TCHARszTitle[MAX_PATH];//

DWORDdwAttributes;

FILETIMECreatTime;

FILETIMELastAccessTime;

FILETIMELastWriteTime;

DWORDdwSizeHigh;

DWORDdwSizeLow;

DWORDkong;

DWORDkong2;

};

8.改变昵称,虽然难度不大,但是它写的和严紧,考虑了各个方面

voidCChatDoc:

:

OnChangname()

{

CChangeNamedlg;

if(dlg.DoModal()==IDOK)

{

if(!

Server&&!

Client)

{

DisplayMessage("系统消息","","服务尚未启动!

",USER_ERROR);

return;

}

if(dlg.m_strNewName=="")

{

DisplayMessage("系统消息","","名字不能为空!

",USER_ERROR);

return;

}

for(POSITIONpos=m_strUserList.GetHeadPosition();pos!

=NULL;)

{

if(dlg.m_strNewName==m_strUserList.GetNext(pos))

{

DisplayMessage("系统消息","","这个名字已经存在!

",USER_ERROR);

return;

}

}

if(Server)

{

for(POSITIONpos=m_strUserList.GetHeadPosition();pos!

=NULL;)

{

POSITIONtpos=pos;

if(strFrom==m_strUserList.GetNext(pos))

{

m_strUserList.SetAt(tpos,dlg.m_strNewName);

strFrom=dlg.m_strNewName;

break;

}

}

msg.m_strUserList.RemoveAll();

for(POSITIONpos2=m_strUserList.GetHeadPosition();pos2!

=NULL;)

{

msg.m_strUserList.AddTail(m_strUserList.GetNext(pos2));

}

DisplayMessage("系统消息","","你已经改名!

",USER_ERROR);

UpdateInfo();

msg.m_strFrom="系统消息";

msg.m_strSay="服务器已改名为:

"+strFrom;

mand=USER_CHANGENAME;

for(POSITIONpos1=m_connectList.GetHeadPosition();pos1!

=NULL;)

{

CConnectSocket*tempSocket=(CConnectSocket*)m_connectList.GetNext(pos1);

SendClientMsg(tempSocket,&msg);

}

}

if(Client)

{

SendMsg(strFrom,dlg.m_strNewName,"改变昵称!

",USER_CHANGENAME);

strFrom=dlg.m_strNewName;

}

}

}

9.在处理结束信息上很不错,内存都释放了

voidCChatDoc:

:

OnCutfuwu()

{

msg.Init();

msg.m_strFrom="系统消息";

msg.m_strSay="服务器已经关闭!

";

mand=USER_STOP;

if(m_pServerSocket!

=NULL)

{

deletem_pServerSocket;

m_pServerSocket=NULL;

}

while(!

m_connectList.IsEmpty())

{

CConnectSocket*pSocket=(CConnectSocket*)m_connectList.RemoveHead();

SendClientMsg(pSocket,&msg);

if(!

pSocket->IsAborted())

{

pSocket->ShutDown

(2);

BYTEbuffer[50];

while(pSocket->Receive(buffer,sizeof(buffer),0)>0);

}

}

Server=FALSE;

Client=FALSE;

m_strUserList.RemoveAll();

m_strHeadList.RemoveAll();

UpdateInfo();

DisplayMessage("系统消息","你","已经关闭了服务器",USER_QUIT);

}

10.在各个“视“的之间传替值,

voidCRightView:

:

OnClickList(NMHDR*pNMHDR,LRESULT*pResult)

{

CChatDoc*pDoc=(CChatDoc*)((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();

CBottomView*pBView=NULL;

for(POSITIONpos=pDoc->GetFirstViewPosition();pos;)

{

CView*pView=pDoc->GetNextView(pos);

if(pView->IsKindOf(RUNTIME_CLASS(CBottomView)))

pBView=(CBottomView*)pView;

}

intsel=m_ListOnline.GetSelectionMark();

if(pBView!

=NULL)

pBView->m_cmbObject.SetCurSel(sel+1);

*pResult=0;

}

4.可扩展的功能

本聊天系统还可扩展一个功能是注册功能,可是本人目前没有固定IP,所以无法长期做服务器,那注册功能也没什么用就没有做了。

因为本人打算这个程序可以免费传替和使用,而且它又是绿色软件,所以暂时不做注册功能。

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

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1