本文是對C#網絡版斗地主的總結,之後還有兩篇,分別介紹地主權限的傳遞和出牌權限的傳遞,還有出牌算法和規則。
服務器使用server類與客戶端通訊,客戶端使用client類與服務器通訊。
當創建游戲時,new出一個server對象,並且開始監聽默認端口“1991”。
然後創建一個線程,用死循環while(true)檢測是否有客戶端連接,如果有的話獲取Client對象,當獲取了兩個Clinet對象後,停止監聽,中斷循環。
服務器獲取了兩個客戶端後,啟動兩個線程“AccpetClient1Data”、“AccpetClient2Data”,使用server中同名方法,分別監聽客戶端1和客戶端2發送的數據。
當加入游戲時,new出一個client對象,並且連接玩家指定的IP,端口默認為1991。
連接上後,啟動線程“AcceptServerData”,使用client中同名方法。
這樣,server端使用方法SendDataForClient向客戶端發送信息,client能夠收到,client端使用SendDataForServer向server端發送信息,Server端也能收到。
值得一提的是,兩個客戶端之間是沒有連接的,他們之間通訊需要通過server端來“代理”。
連接建立好後,客戶端的准備按鈕顯示出來,點擊准備按鈕向服務端發送“OK”字符串,服務器收到後會通過“AccpetClient1Data”、“AccpetClient2Data”這兩個方法識別出來,然後顯示服務器端的開始按鈕。
點擊開始按鈕後,服務器端像客戶端“發送StartPokers+牌組”,發給自己的牌組不需要在網絡中傳輸,所以直接添加到相關的牌組對象中即可。這裡的牌組類要自己寫序列化和反序列化的方法,需要把牌組序列化為byte[]才能在網絡中傳送。
客戶端通過“AcceptServerData”方法讀取並處理“StartPokers+牌組”。處理後的結果是一個PokerGroup對象,把引用傳遞給相應對象就完成發牌了。
後面就是確定地主,出牌權限的傳遞,出出去的牌組的傳遞等等了,也都是使用server和client中的SendDataForServer 和SendDataForClient方法發送byte流,然後使用“AccpetClient1Data”、“AccpetClient2Data”,“AcceptServerData”,完成接受並處理數據。