class
CHallSocket
... {
public:
void requestLogon(); //请求登录
void requestGameList(); //请求游戏列表
void requestRoomList(); //请求某个游戏的房间列表
void requestLoginGame(); //请求登录某个游戏的房间
void onrepLogon(); //大厅服务器 回复 请求登录
void onrepGameList(); //大厅服务器 回复 游戏列表
void onrepRoomList(); //大厅服务器 回复 某个游戏的房间列表
void onLoginGame(); //大厅服务器 回复 登录某个游戏的房间
void setLogonDialog(CLogonDialog* pDlg); // 新增这个方法,与CLogonDialog通信
void setHallDialog(CHallDialog* pDlg); // 通过调用 pDlg 的方法,与 CHallDialog 通信
protected:
void onRecv(); //socket 网络低层回调函数, 当接收数据时触发, 再调用 onrepXXX 函数
} ;
... {
public:
void requestLogon(); //请求登录
void requestGameList(); //请求游戏列表
void requestRoomList(); //请求某个游戏的房间列表
void requestLoginGame(); //请求登录某个游戏的房间
void onrepLogon(); //大厅服务器 回复 请求登录
void onrepGameList(); //大厅服务器 回复 游戏列表
void onrepRoomList(); //大厅服务器 回复 某个游戏的房间列表
void onLoginGame(); //大厅服务器 回复 登录某个游戏的房间
void setLogonDialog(CLogonDialog* pDlg); // 新增这个方法,与CLogonDialog通信
void setHallDialog(CHallDialog* pDlg); // 通过调用 pDlg 的方法,与 CHallDialog 通信
protected:
void onRecv(); //socket 网络低层回调函数, 当接收数据时触发, 再调用 onrepXXX 函数
} ;
当 CHallSocket 需要与多一个窗体通信时,就需要加多一个 setXXXXDialog() 的函数, CHallSocket 与 窗体类关联太密切了,当界面改动时,免不了要修改 CHallSocket ,又要再重新测试。
于是把 CHallSocket 与 界面的通信做成了一个类,俗称“接口类”
class
CHallSocketImpl
... {
void onrepLogon() = 0; //大厅服务器 回复 请求登录
void onrepGameList() = 0; //大厅服务器 回复 游戏列表
void onrepRoomList() = 0; //大厅服务器 回复 某个游戏的房间列表
void onLoginGame() = 0; //大厅服务器 回复 登录某个游戏的房间
} ;
... {
void onrepLogon() = 0; //大厅服务器 回复 请求登录
void onrepGameList() = 0; //大厅服务器 回复 游戏列表
void onrepRoomList() = 0; //大厅服务器 回复 某个游戏的房间列表
void onLoginGame() = 0; //大厅服务器 回复 登录某个游戏的房间
} ;
把 CHallSocket 改成
class
CHallSocket
... {
public:
void requestLogon(); //请求登录
void requestGameList(); //请求游戏列表
void requestRoomList(); //请求某个游戏的房间列表
void requestLoginGame(); //请求登录某个游戏的房间
void onrepLogon(); //大厅服务器 回复 请求登录
void onrepGameList(); //大厅服务器 回复 游戏列表
void onrepRoomList(); //大厅服务器 回复 某个游戏的房间列表
void onLoginGame(); //大厅服务器 回复 登录某个游戏的房间
// 无论要和几个窗口通信,只需通过这个函数告诉 CHallSocket 就可以了, 当然, 这需要 CLoginDialog 和 CHallDialog 都 继承 CHallSocketImpl 类,并且实现类中的方法。
void setSockImpl(CHallSocketImpl* pImpl);
protected:
void onRecv(); //socket 网络低层回调函数, 当接收数据时触发, 再调用 onrepXXX 函数
private:
CHallSocketImpl* m_sockImpl; // 通过 setSockImpl 赋值
} ;
... {
public:
void requestLogon(); //请求登录
void requestGameList(); //请求游戏列表
void requestRoomList(); //请求某个游戏的房间列表
void requestLoginGame(); //请求登录某个游戏的房间
void onrepLogon(); //大厅服务器 回复 请求登录
void onrepGameList(); //大厅服务器 回复 游戏列表
void onrepRoomList(); //大厅服务器 回复 某个游戏的房间列表
void onLoginGame(); //大厅服务器 回复 登录某个游戏的房间
// 无论要和几个窗口通信,只需通过这个函数告诉 CHallSocket 就可以了, 当然, 这需要 CLoginDialog 和 CHallDialog 都 继承 CHallSocketImpl 类,并且实现类中的方法。
void setSockImpl(CHallSocketImpl* pImpl);
protected:
void onRecv(); //socket 网络低层回调函数, 当接收数据时触发, 再调用 onrepXXX 函数
private:
CHallSocketImpl* m_sockImpl; // 通过 setSockImpl 赋值
} ;
窗体类:
class
CLoginDialog :
public
CHallSocketImpl
... {
void onrepLogon() ...{/**//* 服务器返回登录结果的显示 */} //大厅服务器 回复 请求登录
// 由于登录窗体并不显示 游戏列表,房间登录等信息,所以只实现了 onrepLogon 方法
void onrepGameList() ...{} //大厅服务器 回复 游戏列表
void onrepRoomList() ...{} //大厅服务器 回复 某个游戏的房间列表
void onLoginGame() ...{}; //大厅服务器 回复 登录某个游戏的房间
}
class CHallDialog : public CHallSocketImpl
... {
// 同样道理,大厅窗体显示登录相关的信息,因为已经在登录窗体处理后,才进入大厅窗体的,故这里不实现 onrepLogon 方法
void onrepLogon() ...{} //大厅服务器 回复 请求登录
void onrepGameList() ...{ /**//* 显示游戏列表操作 */ } //大厅服务器 回复 游戏列表
void onrepRoomList() ...{ /**//* 显示游戏房间操作 */ } //大厅服务器 回复 某个游戏的房间列表
void onLoginGame() ...{ /**//* 登录游戏显示操作 */ } //大厅服务器 回复 登录某个游戏的房间
}
... {
void onrepLogon() ...{/**//* 服务器返回登录结果的显示 */} //大厅服务器 回复 请求登录
// 由于登录窗体并不显示 游戏列表,房间登录等信息,所以只实现了 onrepLogon 方法
void onrepGameList() ...{} //大厅服务器 回复 游戏列表
void onrepRoomList() ...{} //大厅服务器 回复 某个游戏的房间列表
void onLoginGame() ...{}; //大厅服务器 回复 登录某个游戏的房间
}
class CHallDialog : public CHallSocketImpl
... {
// 同样道理,大厅窗体显示登录相关的信息,因为已经在登录窗体处理后,才进入大厅窗体的,故这里不实现 onrepLogon 方法
void onrepLogon() ...{} //大厅服务器 回复 请求登录
void onrepGameList() ...{ /**//* 显示游戏列表操作 */ } //大厅服务器 回复 游戏列表
void onrepRoomList() ...{ /**//* 显示游戏房间操作 */ } //大厅服务器 回复 某个游戏的房间列表
void onLoginGame() ...{ /**//* 登录游戏显示操作 */ } //大厅服务器 回复 登录某个游戏的房间
}
在显示登录窗体之前通过调用
CHallSocket::setSockImpl(&CLoginDialog); // 设置网络层要回调的接口.
在显示大厅窗体之前同样调用
CHallSocket::setSockImpl(&CHallDialog);
这样做的好处,CHallSocket 并不关心它具体是与哪个窗体进行通信,它只知道与接口 CHallSocketImpl 通信就可以了,这样一来,只要网络通信流程不改变,无论要把整个登录游戏的过程分成多少个窗体来显示,都可以不用修改 CHallSocket 类,一来方便修改代码,二来也减少了出错的机会。
(未完,等续)