轉(zhuǎn)載請注明出處!
上篇五子棋<一>
http://www.shnenglu.com/bujiwu/archive/2009/08/23/94199.html
主要實現(xiàn)了五子棋的界面與下棋業(yè)務(wù)流程。
這二天實現(xiàn)了以下計劃中的第一點,完成了網(wǎng)絡(luò)對戰(zhàn)功能,并實現(xiàn)了網(wǎng)絡(luò)悔棋。
1、網(wǎng)絡(luò)對戰(zhàn)功能(包括GameClient與GameServer類,可以了解Socket編程)。
2、人機對戰(zhàn)功能(目前還沒有好的思路)。
由于五子棋服務(wù)端與客戶端通訊比較簡單,所以只用最簡單的網(wǎng)絡(luò)通訊模式(沒有使用IOCP)。定義網(wǎng)絡(luò)通訊抽象基類CBaseSocket。
客戶端類CGameClient與CGameServer類繼承CBaseSocket基類。并實現(xiàn)bool SendPacket(void* pMsg, int len) 與 bool Initialize(int Port, char* pAddress) 純虛函數(shù)。由于CGameClient與CGameServer都繼承CBaseSocket,所以可以通過多態(tài)的實例化具體的客戶端類或服務(wù)端類。 如下:
服務(wù)端類當(dāng)accept客戶端就壓入到vector,主要是為了以后支持網(wǎng)絡(luò)模式下可以觀棋的客戶端連接。
其它就是打包、解包的工作了。

代碼:
/Files/bujiwu/Gobang.rar
上篇五子棋<一>
http://www.shnenglu.com/bujiwu/archive/2009/08/23/94199.html
主要實現(xiàn)了五子棋的界面與下棋業(yè)務(wù)流程。
這二天實現(xiàn)了以下計劃中的第一點,完成了網(wǎng)絡(luò)對戰(zhàn)功能,并實現(xiàn)了網(wǎng)絡(luò)悔棋。
1、網(wǎng)絡(luò)對戰(zhàn)功能(包括GameClient與GameServer類,可以了解Socket編程)。
2、人機對戰(zhàn)功能(目前還沒有好的思路)。
由于五子棋服務(wù)端與客戶端通訊比較簡單,所以只用最簡單的網(wǎng)絡(luò)通訊模式(沒有使用IOCP)。定義網(wǎng)絡(luò)通訊抽象基類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 };
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基類。并實現(xiàn)bool SendPacket(void* pMsg, int len) 與 bool Initialize(int Port, char* pAddress) 純虛函數(shù)。由于CGameClient與CGameServer都繼承CBaseSocket,所以可以通過多態(tài)的實例化具體的客戶端類或服務(wù)端類。 如下:
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 }
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 }
服務(wù)端類當(dāng)accept客戶端就壓入到vector,主要是為了以后支持網(wǎng)絡(luò)模式下可以觀棋的客戶端連接。
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 };
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