使用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以示区别
然后点击第一个客户端的按钮,就会提示等待,并且根据服务端收到的消息,说明客户端已经成功连上服务器
然后点击第二个客户端:
服务端收到第二个客户端的消息,由于人数不够还未开局,继续点击第三个客户端:
这下人数够了,服务器分别给每个客户端发送消息:可以开始游戏了
(说明:代码素材了之类都来自网上,东拼西凑而来,具体来自哪里真的忘了,侵删)