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


void UpdateChattersListView(CString sName ;
更新服务器用户列表视图
CClientSocket* pSocket)
BOOL IsUsedName(CString sNickName) 检查新登录的用户其用户名是否已被使用
void CloseSocket(CClientSocket* pSocket) 关闭连接
void DeleteChatter(CMsg* pMsg) 删除用户
virtual void DeleteContents() 当程序退出时做一些关闭、删除处理
下面为各函数编写代码。首先在构造函数中将各成员变量初始化,代码如下:
CChatServerDoc::CChatServerDoc()

// TODO: add one…time construction code here
m_pSocket = NULL;
m_msgList。RemoveAll();
m_connectionList。RemoveAll();
bIsNewChatter = TRUE;
m_ChattersList = 〃〃;

接着为“设定端口”菜单项添加响应函数,代码如下:
void CChatServerDoc::OnSetport()

// TODO: Add your mand handler code here
CPortDlg dlg;
if(dlg。DoModal() == IDOK)

//创建一个新的类进行监听
m_pSocket = new CListeningSocket(this);
if (m_pSocket…》Create(dlg。m_Port))

if (m_pSocket…》Listen())
return;



·301 ·
…………………………………………………………Page 313……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
为函数 ProcessAccept()添加如下代码:
void CChatServerDoc::ProcessAccept()

//创建一个新的 Socket 来处理与客户端的数据交互
CClientSocket* pSocket = new CClientSocket(this);
//如果接受客户端的连接请求
if (m_pSocket…》Accept(*pSocket))

//初始化
pSocket…》Init();
//将此连接 socket 加入连接链表中
m_connectionList。AddTail(pSocket);

//如果不接受连接
else
delete pSocket;

为函数 ProcessReceive()添加如下代码:
void CChatServerDoc::ProcessReceive(CClientSocket* pSocket)

CMsg* pMsg; //接收的消息
CString sName; //用户名
BOOL bIsUsedName = FALSE; //用户名是否已使用
bIsNewChatter = FALSE; //是否为新用户
do

//接收消息
pMsg = ReadMsg(pSocket);
//如果此消息是发送的新的用户名(在用户登录时客户端先发此消息)
if(pMsg…》code == SENDING_NICKNAME)

sName = pMsg…》m_strText;
bIsNewChatter = TRUE;
//检查此用户名是否已使用
if(IsUsedName(sName))
bIsUsedName = TRUE;

//如果连接已关闭则退出
if (pMsg…》m_bClose)

·302 ·
…………………………………………………………Page 314……………………………………………………………
第 11 章 网络编程
break;


while (!pSocket…》m_pArchiveIn…》IsBufferEmpty());
//如果是用户登录
if(bIsNewChatter)

//如果此用户名没有被使用
if(!bIsUsedName)

//发送消息通知各客户端
pMsg…》code = SENDING_CHATTERS_LIST;
m_ChattersList += sName + 〃:〃;
pMsg…》m_strText = m_ChattersList;
SendForNewer(pMsg);

//如果用户名已使用
else

//发消息通知此客户端
CMsg* msg = new CMsg;
msg…》Init();
msg…》code = USED_NAME;
CString string;
string。Format(〃用户名已被使用!〃);
msg…》m_strText = string;
SendMsg(pSocket; msg);

bIsNewChatter = FALSE;
bIsUsedName = FALSE;

//如果消息表明该客户端已关闭连接
if (pMsg…》m_bClose)

//发送消息通知各客户端
SendToAllClients(NORMAL_MESSAGE);
//在视图中将该用户删除
DeleteChatter(pMsg);
//关闭连接
·303 ·
…………………………………………………………Page 315……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
CloseSocket(pSocket);
//通知各客户端更新用户列表
SendToAllClients(SENDING_CHATTERS_LIST);

//如果是普通消息,发送给各客户端
else
SendToAllClients(NORMAL_MESSAGE);

为 ReadMsg() 函数编写如下代码:
CMsg* CChatServerDoc::ReadMsg(CClientSocket* pSocket)

static CMsg msg;
TRY

//接收数据
pSocket…》ReceiveMsg(&msg);
小说推荐
返回首页返回目录