首页 > 代码库 > SuperSocket框架学习笔记4-SuperWebSocket---使用SubCommandBase

SuperSocket框架学习笔记4-SuperWebSocket---使用SubCommandBase

首先下载所需要的 DLL

http://download.csdn.net/detail/wai2dance123/7389285

 

或者参见第2章  到SuperSocket官网下载

http://www.cnblogs.com/xmcrew/p/3747354.html

 

 

1,新建一个 .NET4.0 控制台应用程序 命名为 DiyServers

添加以下引用

 

将默认的Program.cs改名为  DiyServers.cs

 

并添加以下命名空间

 

 

2,写自己的DSession和DServer继承自 《 WebSocketSession  和 WebSocketServer 》

新建两个class文件 分别命名   DSession和DServer

并都 添加以下命名空间

 

 

首先在 DSession中 添加 父类继承

public class DSession : WebSocketSession<DSession>

再添加以下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;



using SuperWebSocket.SubProtocol;
using System.Reflection;
using SuperWebSocket;
using SuperSocket.SocketBase;
namespace DiyServer
{
    public class DSession : WebSocketSession<DSession>
   {

       public string Name { get; private set; }

       protected override void OnSessionStarted()
       {
           //Read name from path
           var name = Path;

           if (string.IsNullOrEmpty(name))
               name = "Anoy";
           else
               name = Path.TrimStart(/);

           Name = name;
           Console.WriteLine("有新用户连接到服务器了"+ this.SessionID);
           this.Send("Welcome to DiySuperWebSocket");
       }

       

       protected override void OnSessionClosed(CloseReason reason)
       {
           Console.WriteLine("客户端断开了连接");
           //add your business operations
       }

    }
}
View Code


再到 DServer中  添加父类继承 【注意后面的泛型参数 为上面定义的 客户端连接类 DSession】

public class DServer : WebSocketServer<DSession>

DServer中内容暂时可以不用写太多,具体后期可以添加功能

完整代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SuperWebSocket.SubProtocol;
using System.Reflection;
using SuperWebSocket;
namespace DiyServer
{
    public class DServer : WebSocketServer<DSession>
    {
        public DServer()
        { 
            
        }

        

    }
}
View Code


3,添加处理类 ADD  和 SUB ,并继承自SubCommandBase<xxSession>

添加两个Class文件,分别命名 ADD.cs 和 SUB.cs 

【特别注意参数为 SubCommandBase<DSession>,我在这里纠结了好久】

ADD.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using SuperWebSocket.SubProtocol;

namespace DiyServer
{
    public class ADD : SubCommandBase<DSession>
    {
        public override void ExecuteCommand(DSession session, SubRequestInfo requestInfo)
        {
            var paramArray = requestInfo.Body.Split(#);

            session.Send(
                "ADD 返回数值Function Bakc:" +  
                ( 
                int.Parse(  paramArray[0].ToString()  ) 
                + 
                int.Parse(  paramArray[1].ToString()  )
                ).ToString()
                );
            Console.WriteLine("GetADDCommand");
            
          

        }
    }
}
View Code

SUB.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using SuperWebSocket.SubProtocol;

namespace DiyServer
{
    public class SUB : SubCommandBase<DSession>
    {
        public override void ExecuteCommand(DSession session, SubRequestInfo requestInfo)
        {
            var paramArray = requestInfo.Body.Split(#);
           
          
            session.Send("SUB Function Bakc:" + 
                (
                int.Parse(  paramArray[0].ToString() ) 
                - 
                int.Parse(  paramArray[1].ToString() )
                ).ToString()
                );

            Console.WriteLine("GetSUBCommand");

        }
    }
}
View Code


4,添加系统 Config文件 ,并添加commandAssemblies 节点

从 SuperWebSocket.Source源码里面

将App.config 复制到  本项目根目录下,并右键项目,选择添加现有项

继续添加

 

然后在VS2012中打开这个App.config文件

在server [非servers]节点中 添加以下节点

 

其它的节点暂时还不知道具体什么意思,望大家指点,我这里就没有变动,就是添加了

commandAssemblies这个节点

完整 App.config代码如下 :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
  </configSections>
  <appSettings>
    <add key="ServiceName" value="SuperWebSocket"/>
  </appSettings>
  <superSocket>
    <servers>
      <server name="SuperWebSocket"
              serverTypeName="SuperWebSocket"
              ip="Any" port="2013">
        <commandAssemblies>
          <add assembly="BasicModules"></add>
        </commandAssemblies>
      </server>
    </servers>
    <serverTypes>
      <add name="SuperWebSocket"
           type="SuperWebSocket.WebSocketServer, SuperWebSocket" />
    </serverTypes>
  </superSocket>
</configuration>
View Code


5,开始服务端DiyServers.cs 主程序编程

完整代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SuperWebSocket;
using SuperWebSocket.SubProtocol;

using System.Reflection;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Config;


namespace DiyServer
{
    public class DiyServers
    {
       
        static void Main(string[] args)
        {
           

            Console.WriteLine("SuperWebSocket.DiyServer服务器\n 请按一下任意键启动服务器!");

            Console.ReadKey();
            Console.WriteLine();
            //声明自己的WebSocketServer类
            var appServer = new DServer();
           
            var serConfig = new ServerConfig();
            serConfig.Port = 2012;
            //设置编码类型,默认的我试过了,Unity3D无法识别中文
            serConfig.TextEncoding = "GB2312";
            
            //Setup the appServer
            if (!appServer.Setup(serConfig )) //Setup with listening port
            {
                Console.WriteLine("初始化失败!");
                Console.ReadKey();
                return;
            }
                  
            Console.WriteLine();

            //Try to start the appServer
            if (!appServer.Start())
            {
                Console.WriteLine("服务器启动失败!");
                Console.ReadKey();
                return;
            }

            Console.WriteLine("服务器启动成功, 按 ‘q‘ 退出服务器!");

            while (Console.ReadKey().KeyChar != q)
            {
                Console.WriteLine("客户端数:"+ appServer.SessionCount );
                Console.ReadKey();
                continue;
            }

            //停止服务器 the appServer
            appServer.Stop();

            Console.WriteLine();
            Console.WriteLine("The server was stopped!");
            Console.ReadKey();


        }




    }
}
View Code

注释很清楚了 不再多说

 

6,更新添加 笔记3下的 Unity客户端 发送 ADD 和 SUB 指令代码

Unity3D客户端 搭建具体参考 【注意Unity最高支持.Net3.5】 

http://www.cnblogs.com/xmcrew/p/3747441.html

我这个版本稍有变动

在 OnGUI()函数里添加两个 按钮 分别 发送ADD 指令 和 SUB指令

注意发送内部 字符串和参数之间有一个空?格【为了看起来直观,用一个问号占位,实际中没有】

"ADD?5#6" 

"SUB?26#1"

 

 

 客户端 完整代码如下

注意Unity3D类名需要和文件名完全一致,并且不得使用中文路径,请注意

sSCilents.cs

using UnityEngine;
using System.Collections;
using System;
using System.Text;
using System.Net;
using SuperSocket.ClientEngine;

using WebSocket4Net;

using System.Threading;


public class sSCilents : MonoBehaviour {

    
    public WebSocket myClient;
    
    public string Mgs;
    
    Thread UnityThread;
    void Awake()
    {
        
        Mgs ="ServerBackData";
        Application.runInBackground = true;
    }

    
    
    void OnGUI()
    {
       if(GUILayout.Button("Connected") )
       {
            UnityThread = new Thread(new ThreadStart(StatUnityClient ) );
            UnityThread.Start();
            
       }
        
        Mgs = GUI.TextField( new Rect(120,0,200,50), Mgs );
        if(GUILayout.Button("Sends ADD") )
       {
             myClient.Send( "ADD 5#6"  );
            Debug.Log( "Send SUB OK" );
            
       }
        
        
        if(GUILayout.Button("Send SUB") )
       {
           
           myClient.Send( "SUB 26#1"  );
            Debug.Log( "Send SUB OK" );
          
       }
    
    }
    
    
    public void StatUnityClient()
    {
          
            myClient = new  WebSocket( "ws://127.0.0.1:2012");
            myClient.Opened += OnConnectedss;
            
        
            myClient.DataReceived +=OnDataReceivedss;
            myClient.MessageReceived += OnMessageReceivedss;
            myClient.Open();
        
    }
    
    public void OnConnectedss(object sender, EventArgs e )
    {
        
         myClient.Send("Hello World!");

        Debug.Log("NewConnected To Server OKOK");
    }
    
    
    public void OnDataReceivedss(object sender, DataReceivedEventArgs e )
    {
        
        Debug.Log(  Encoding.GetEncoding("gb2312").GetString( e.Data ) );
        
        Mgs = Encoding.GetEncoding("gb2312").GetString( e.Data );
        
         Debug.Log("NewDataRevcei ");
        
            }
    
        
    public void OnMessageReceivedss(object sender, MessageReceivedEventArgs e )
    {
        
        Debug.Log(   e.Message  );
        
    }
    public void OnApplicationQuit()
    {
        
        myClient.Close();
        myClient = null;
        UnityThread.Abort();
        UnityThread = null;
    }
    
}
View Code

 

7,测试测试Let‘s GOGOGO,见证奇迹的时候到了,嘿嘿!

先启动服务器这边 ,如图 说明服务器启动成功

 

再启动Unity3D客户端

 

先点击 Connected , 点击左下角

弹出控制台 或者 点击上面的Windows-->Console

 

再分别点击 Sends ADD 和 Send SUB按钮

 

出现如图 数据,恭喜SuperWebSocket服务器自定义SubCommandBase命令加载器

搭建成功!嘿嘿嘿!

未完,待续......敬请期待

本人C#菜鸟,很多还没有研究透,代码写的渣渣,请勿扔鸡蛋,嘿嘿嘿!

我的小站:http://wai2dance.s1.jutuo.net/

QQ:2360450496

SuperSocket官方QQ群:373076764

欢迎大家来一起研究开发这个Socket框架!