zoukankan      html  css  js  c++  java
  • 使用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

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

    代码下载

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

  • 相关阅读:
    第二次结对编程作业
    第一次结对编程作业
    第一次个人编程作业
    第一次博客作业
    第09组 Alpha冲刺(4/6)
    第09组 Alpha冲刺(3/6)
    第09组 Alpha冲刺(2/6)
    第09组 Alpha冲刺(1/6)
    第09组 团队Git现场编程实战
    第09组 团队项目-需求分析报告
  • 原文地址:https://www.cnblogs.com/madyina/p/15755336.html
Copyright © 2011-2022 走看看