聊天程序设计报告计算机网络文档格式.docx

上传人:b****1 文档编号:4274018 上传时间:2023-05-03 格式:DOCX 页数:20 大小:877.59KB
下载 相关 举报
聊天程序设计报告计算机网络文档格式.docx_第1页
第1页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第2页
第2页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第3页
第3页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第4页
第4页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第5页
第5页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第6页
第6页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第7页
第7页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第8页
第8页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第9页
第9页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第10页
第10页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第11页
第11页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第12页
第12页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第13页
第13页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第14页
第14页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第15页
第15页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第16页
第16页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第17页
第17页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第18页
第18页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第19页
第19页 / 共20页
聊天程序设计报告计算机网络文档格式.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

聊天程序设计报告计算机网络文档格式.docx

《聊天程序设计报告计算机网络文档格式.docx》由会员分享,可在线阅读,更多相关《聊天程序设计报告计算机网络文档格式.docx(20页珍藏版)》请在冰点文库上搜索。

聊天程序设计报告计算机网络文档格式.docx

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

设计使用说明:

此聊天程序的实现主要通过两部分实现,一个是客户端,一个是服务器端。

服务器端可开启服务,等待用户登录,实现消息的中转发送;

客户端可以通过服务器端的IP

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

当前位置:首页 > 初中教育 > 语文

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

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