精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
利用CLassWizard为按纽IDC_SETSERVER添加响应函数OnSetserver。当用户单击按纽IDC_SETSERVER时,函数OnSetserver会被框架自动调用。在函数OnSetserver中进行启动服务器的操作。
在OnSetserver函数中,判断服务器是否已经开启。
若服务器未开启,则首先创建侦听套接字,建立侦听。其次,加载用户信息。再次,调整用户界面,显示与隐藏的相应控件。最后更新所有提示信息,并将服务器的开启标识m_lsServerOn设置为TRUE。
若服务器已开启,则调整用户界面显示与隐藏相应控件,并更新所有提示信息。
在CMyQQServerDlg类中,添加CListenSocket类型的私有成员变量m_listenSocket,变量m_listenSocket是整个聊天服务器系统唯一的侦听套接字。侦听套接字一经创建,可以指定端口侦听客户端的连接。
在CMyQQServerDlg类中,添加SetListenSocket成员函数。在函数SetListenSocket中,建立侦听套接字。
其实现代码如下:
在CMyQQServerDlg类中,添加成员函数OnAccept。当侦听套接字接受到客户连接请求时,此函数将会被调用。
在 OnAccept函数中,首先设置连接套接字的父窗口指针,接着调用连接套接字中的OnAccept函数接受客户端连接请求,并将用户接受客户端请求的连接套接字保存在m_listenSocket链表中。
其实现代码如下:
当用户类型标识msg.m_msgtype值为0时,说明此条信息为用户注册请求,服务器此时执行用户注册请求的操作。
在处理用户注册请求的时候,首先将数据缓冲区msg.m_msgBuff中的信息强型转化成SUserInfo类型,将信息类型标识msg.m_msgtype修改为5,表示注册已经成功。其次调用函数GenerateID为该用户生成一个唯一的用户ID,将其赋值给info->m_infoID,并且 其实现代码如下:
修改用户在线标识info->m_infoIsOnLine为1,表示用户已上线,将新注册的用户追加到用户的链表m_lstAllUser尾部。
登陆是非常复杂的过程,除了要判断用户的合法性外还要多个存储在服务器上的消息返回。其登陆过程如下图8:
图8:登陆过程
当在用户列表中找到与此用户ID相同的元素时,将msg.m_msgtype修改为9,表示缓冲区内容为用户信息,并将所查找到的用户信息拷贝到msg.m_msgBuff缓冲区中,将消息msg发送给客户端。
处理下载用户信息请求的实现代码如下:
当信息类型标识msg.m_msgtype值为2时,说明此条信息为用户下线请求,服务器需要执行处理用户下线请求的操作。首先将数据缓冲区msg.m_msgBuff中的信息强制转化成SUserInfo类型。然后遍历用户列表,查找与此用户ID相同的元素。当找到与此ID相同的元素,就将用户的在线标识设为0,表示此用户已经离线。将msg.m_msgtype修改为2,表示用户成功离线。关闭对应的套接字,更新界面提示信息。
当msg.m_msgtype值为5时,服务器需要执行处理修改资料请求的操作。首先将数据缓冲区msg.m_msgBuff 中的信息强型转化成SUserInfo类型。然后遍历用户列表,查找与此用户ID相同的元素。若在用户列表中找到与此用户ID相同的元素,则修改此用户的信息,存入用户链表中,并向客户端发送资料修改成功的消息。
服务器系统的消息是服务器发送给所有客户端的广播信息,比如服务器将在某个时间重启,或是其它的提示信息。
首先利用CLassWizard为按纽IDC_SYSTEMMSG添加响应函数OnSystemmsg,其实现代码如下:
然后利用CLassWizard为按纽IDC_SENDMSG添加响应函数OnSendmsg。其实现代码如下:
利用CLassWizard为按纽IDC_STOPSERVER添加响应函数OnStopserver,如下图:
在OnStopserver函数中,将服务器开启标识设置为FALSE,将所有计数器清0。关闭侦听套接字,停止接受客户端连接。修改界面提示信息,调整相关控件的属性。准备客户端通知消息。遍历套接字链表m_lstSocket,向所有用户发送服务器关闭的消息。调用SaveToFile函数,将所有用户信息存入文件中,并清空用户链表。