轉載請注明出處!
上篇五子棋<一>
http://www.shnenglu.com/bujiwu/archive/2009/08/23/94199.html主要實現了五子棋的界面與下棋業務流程。
這二天實現了以下計劃中的第一點,完成了網絡對戰功能,并實現了網絡悔棋。
1、網絡對戰功能(包括GameClient與GameServer類,可以了解Socket編程)。2、人機對戰功能(目前還沒有好的思路)。
由于五子棋服務端與客戶端通訊比較簡單,所以只用最簡單的網絡通訊模式(沒有使用IOCP)。定義網絡通訊抽象基類CBaseSocket。
1 typedef void (* RECVFUNC)(char *pMsg, int len);
2
3 class CBaseSocket
4 {
5 public:
6 CBaseSocket();
7 virtual ~CBaseSocket();
8
9 virtual bool SendPacket(void* pMsg, int len) = 0;
10 virtual bool Initialize(int Port, char* pAddress) = 0;
11
12 protected:
13 bool InitWinSock();
14
15 protected:
16 SOCKET hSocket;
17 static RECVFUNC pRecv;
18 };
客戶端類CGameClient與CGameServer類繼承CBaseSocket基類。并實現bool SendPacket(void* pMsg, int len)
與 bool Initialize(int Port, char* pAddress)
純虛函數。由于CGameClient與CGameServer都繼承CBaseSocket,所以可以通過多態的實例化具體的客戶端類或服務端類。
如下:
1 定義:
2 CBaseSocket *pSocket = NULL;
3
4 if(IsDlgButtonChecked(hDlg, IDC_RADI_HOST))
5 {
6 pSocket = new CGameServer(RecvPktCallBack);
7 gMode = SERVER_MODE;
8 EnableWindow( GetDlgItem(hDlg, IDOK), FALSE);
9 }
10 else
11 {
12 pSocket = new CGameClient(RecvPktCallBack);
13 gMode = CLIENT_MODE;
14 GetDlgItemText(hDlg, IDC_EDIT_IP, pAddress, sizeof(pAddress) );
15 }
服務端類當accept客戶端就壓入到vector,主要是為了以后支持網絡模式下可以觀棋的客戶端連接。
1 class CGameServer:public CBaseSocket
2 {
3 public:
4 CGameServer(RECVFUNC pRecv);
5 ~CGameServer();
6
7 bool SendPacket(void* pMsg, int len);
8 bool Initialize(int Port, char* pAddress);
9
10 private:
11 static DWORD WINAPI RecvThread(LPVOID lpPara);
12 static DWORD WINAPI AcceptThread(LPVOID lpPara);
13
14 private:
15 static vector<SOCKET> ClientVec;
16 };
其它就是打包、解包的工作了。

代碼:
/Files/bujiwu/Gobang.rar