《VC语言6.0程序设计从入门到精通》第119章



CATCH(CFileException; e)

msg。m_bClose = TRUE;
m_pArchiveOut…》Abort();
CString strTemp;
strTemp。Format(〃接收数据失败〃);
DisplayMsg(strTemp);

END_CATCH
//如果连接已关闭则删除各对象
if (msg。m_bClose)

delete m_pArchiveIn;
·318 ·
…………………………………………………………Page 330……………………………………………………………
第 11 章 网络编程
m_pArchiveIn = NULL;
delete m_pArchiveOut;
m_pArchiveOut = NULL;
delete m_pFile;
m_pFile = NULL;
delete m_pSocket;
m_pSocket = NULL;


为 DisplayMsg() 函数编写如下代码:
void CChatClientDoc::DisplayMsg(LPCTSTR lpszText)

for(POSITION pos=GetFirstViewPosition();pos!=NULL;)

CView* pView = GetNextView(pos);
CMessageView* pChatView = DYNAMIC_DOWNCAST(CMessageView; pView);
if (pChatView != NULL)
pChatView…》ShowMessage(lpszText);


为 UpdateChattersList() 函数编写如下代码:
void CChatClientDoc::UpdateChattersList(CMsg* pMsg)

CChattersView* pChattersView;
for(POSITION pos=GetFirstViewPosition();pos!=NULL;)

CView* pView = GetNextView(pos);
pChattersView = DYNAMIC_DOWNCAST(CChattersView; pView);
//首先清空用户列表视图
if (pChattersView != NULL)
pChattersView…》ClearChattersList();

CString strTemp = pMsg…》m_strText;
//得到所有的用户名并加入到用户列表中
do

CString sName = strTemp。Left(strTemp。Find(〃:〃;0));
pChattersView…》AddToChattersList(sName);
strTemp = strTemp。Mid(strTemp。Find(〃:〃 ; 0)+1);
}while(strTemp。Find(〃:〃;0) != …1);
·319 ·
…………………………………………………………Page 331……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通

为 DeleteContents() 函数编写如下代码:
void CChatClientDoc::DeleteContents()

if ((m_pSocket != NULL) && (m_pFile != NULL) && (m_pArchiveOut != NULL))

//首先发送用户名
SendMsg(m_strName; LEAVING_CHAT; false);
CMsg msg;
CString strTemp;
//发送普通消息
strTemp。Format(〃:离开了聊天室〃);
msg。code = NORMAL_MESSAGE;
msg。m_bClose = TRUE;
msg。m_strText = m_strName + strTemp;
msg。Serialize(*m_pArchiveOut);
m_pArchiveOut…》Flush();

//删除各对象
delete m_pArchiveOut;
m_pArchiveOut = NULL;
delete m_pArchiveIn;
m_pArchiveIn = NULL;
delete m_pFile;
m_pFile = NULL;
//关闭连接
if (m_pSocket != NULL)

m_pSocket…》ShutDown(2);
delete m_pSocket;
m_pSocket = NULL;

//更新视图
for(POSITION pos=GetFirstViewPosition();pos!=NULL;)

CView* pView = GetNextView(pos);
if (pView…》IsKindOf(RUNTIME_CLASS(CMessageView)))

CMessageView* pChatView = (CMessageView*)pView;
pChatView…》GetEditCtrl()。SetWindowText(_T(〃〃));
·320 ·
…………………………………………………………Page 332……………………………………………………………
第 11 章 网络编程

if (pView…》IsKindOf(RUNTIME_CLASS(CChattersView)))

CChattersView* pCChattersView = (CChattersView*)pView;
pCChattersView…》ClearChattersList();


CDocument::DeleteContents();

至此,整个程序编写完毕。分别运行服务器端程序和客户端程序,效果如图 11…13~图 11…15 
所示。
图 11…13 服务器端界面 图 11…14 客户端界面 1
图 11…15 客户端界面 2
本程序实现了一个简单的基于服务器/客户端模型的网络聊天系统,系统功能虽然简单, 
但是体现了一般网络编程的基本步骤 。在本程序中,由于对信息进行了封装,且采用了文档
视图结构,用户可以很容易扩展其功能,比如可以加入两人私聊(其他人看不到聊天内容 )、 
服务器广播等功能。由于篇幅所限,这些功能请读者自行实现。
小说推荐
返回首页返回目录