使用SuperSocket开发联网斗地主(一):联网

本章开始尝试着开发一个联网斗地主,感受一下webscoket的有趣。

一、 新建一个winform程序,添加如下引用

image

界面编辑如下:

image

然后创建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以示区别

1

然后点击第一个客户端的按钮,就会提示等待,并且根据服务端收到的消息,说明客户端已经成功连上服务器

2

然后点击第二个客户端:

3

服务端收到第二个客户端的消息,由于人数不够还未开局,继续点击第三个客户端:

4

这下人数够了,服务器分别给每个客户端发送消息:可以开始游戏了

代码下载

(说明:代码素材了之类都来自网上,东拼西凑而来,具体来自哪里真的忘了,侵删)

posted @ 2022-01-01 14:03  石曼迪  Views(394)  Comments(0Edit  收藏  举报
瓴域建设-环保事业中心