使用SuperSocket開發聯網斗地主(一):聯網
本章開始嘗試著開發一個聯網斗地主,感受一下webscoket的有趣。
一、 新建一個winform程序,添加如下引用
界面編輯如下:
然后創建webscoket監聽代碼:
webSocketServer = new WebSocketServer(); var isSetup = webSocketServer.Setup("192.168.1.6", 2018); bar_Info.Text="服務器端啟動" + (isSetup ? "成功" : "失敗"); if (!isSetup) return; webSocketServer.NewSessionConnected += WebSocketServer_NewSessionConnected; webSocketServer.SessionClosed += WebSocketServer_SessionClosed; webSocketServer.NewMessageReceived += WebSocketServer_NewMessageReceived; var isStart = webSocketServer.Start(); bar_IpInfo.Text="服務器端偵聽" + (isStart ? "成功" : "失敗");
分別實現這三個事件:
/// <summary>
/// 接收消息
/// </summary>
/// <param name="session"></param>
/// <param name="value"></param>
private void WebSocketServer_NewMessageReceived(WebSocketSession session, string value)
{
txtMessage.Text+="接收消息 \r\n" + value;
}
/// <summary> /// 下線 /// </summary> /// <param name="session"></param> /// <param name="value"></param> private void WebSocketServer_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value) { string message = string.Format("Session Close:{0}, IP:{1}\r\n", value.ToString(), session.RemoteEndPoint); txtMessage.Text += message; }
/// <summary> /// 上線 /// </summary> /// <param name="session"></param> private void WebSocketServer_NewSessionConnected(WebSocketSession session) { string message = string.Format("Session:{0}, IP:{1}\r\n", session.SessionID.ToString(), session.RemoteEndPoint); txtMessage.Text += message; }
/// <summary> /// 給客戶端發送消息 /// </summary> /// <param name="session"></param> /// <param name="message"></param> public void SendMessage(WebSocketSession session, string message) { //Task.Factory.StartNew(() => { if (session != null && session.Connected) session.Send(message); }); if (session != null && session.Connected) session.Send(message); }
重點在接收客戶端數據這里,根據客戶端發來的請求做出不同的響應:
如客戶端發來“ready”服務端就知道這個客戶端已經準備好了,邏輯如下:
//解密,校驗數據 var data = JsonConvert.DeserializeObject<RequestModel>(value); switch (data.Action) { case "ready": //處理客戶端準備好的情況 break; case "heart": //處理心跳 break; default: break; }
我們以斗地主為例,準備好的人數夠三個就開始游戲:
if (DouDiZhuGameConfig.UserList.Count() < 3) { DouDiZhuGameConfig.UserList.Add(userSessionId,addUser); } return DouDiZhuGameConfig.UserList.Count() == 3 ? true : false;
不夠就加入,然后客戶端給服務端發送每位用戶準備好的消息:
cmd.action = "ready"; cmd.message = JSON.stringify(user); //客戶端發送消息到服務端 _ws.sendMessage(JSON.stringify(cmd));
這里約定一個類,將指令和數據分開:
public class RequestModel { public string Action { get; set; } public string Message { get; set; } }
二、找三個瀏覽器,分別實驗
啟動服務器,啟動三個客戶端,起名為111,222,333以示區別
然后點擊第一個客戶端的按鈕,就會提示等待,并且根據服務端收到的消息,說明客戶端已經成功連上服務器
然后點擊第二個客戶端:
服務端收到第二個客戶端的消息,由于人數不夠還未開局,繼續點擊第三個客戶端:
這下人數夠了,服務器分別給每個客戶端發送消息:可以開始游戲了
(說明:代碼素材了之類都來自網上,東拼西湊而來,具體來自哪里真的忘了,侵刪)







浙公網安備 33010602011771號