dTail(m_ChattersList);
}
为DeleteContents()函数编写如下代码:
void CChatServerDoc::DeleteContents()
{
if(m_pSocket == (CListeningSocket*)NULL)
return;
//删除jiān tīngsocket
delete m_pSocket;
m_pSocket = NULL;
枫叶文学网www.fywxw.com
第11 章 网络编程
·309·
CString temp;
temp.Format("服务器已关闭");
m_msgList.AddTail(temp);
//对当前连接的每个客户端发送信息后关闭与该客户端的连接
while(!m_connectionList.IsEmpty())
{
CClientSocket* pSocket = (CClientSocket*)m_connectionList.RemoveHead();
CMsg* pMsg = AssembleMsg(pSocket , NORMAL_MESSAGE);
pMsg->m_bClose = TRUE;
SendMsg(pSocket, pMsg);
pSocket->ShutDown(2);
delete pSocket;
}
//清空所有信息
m_msgList.RemoveAll();
CDoccomnt::DeleteContents();
}
至此,服务器端代码已经编写完成。
技巧:检测#if 语句和#endif 语句是否匹配
将光标定位到想要匹配的#if 语句或#endif 语句,利用快捷键“Ctrl+K”,则光标就会自动定
位到与之匹配的#endif 语句或#if 语句。如果没有与之匹配的语句,光标则不移动。
技巧:检测括号是否匹配
将光标移动到需要检测的括号(如大括号{}、方括号[]、圆括号()和尖括号<>等)前面,键
入快捷键“Ctrl+]”。如果括号匹配正确,则光标跳到匹配的括号处;否则光标不移动,并
且机箱喇叭还会发出一声警告声。
11.4.3 客户端程序设计
客户端的设计与服务器端很类似。
? 使用编写服务器端程序时封装的消息类。
? 界面由3 个窗口组成,分别用于显示聊天内容,显示用户列表以及输入要发送的消息。
? 用户登录或断开时,都要首先以某种信息类型发送用户名,然后发送正式的消息。收
到服务器的消息时,如果是普通消息,则显示出来;如果是用户登录或断开的消息,
则更新用户列表。
由于客户端程序的编写和服务器端在很大程度上相同,因此这里不再详细叙述过程,而
是在简要说明的基础上把主要的代码列出来。
枫叶文学网www.fywxw.com
Visual C++