zoukankan      html  css  js  c++  java
  • SuperSocket使用demo

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using SuperSocket.Common;
    using SuperSocket.Facility.Protocol;
    using SuperSocket.SocketBase;
    using SuperSocket.SocketBase.Protocol;
    using SuperSocket.SocketEngine;

    namespace OilServer
    {
    class Program
    {
    static void Main(string[] args)
    {
    #region 从配置文件启动
    var bootstrap = BootstrapFactory.CreateBootstrap();
    if (!bootstrap.Initialize())
    {
    Console.WriteLine("Failed to initialize!");
    Console.ReadKey();
    return;
    }
    var result = bootstrap.Start();

    Console.WriteLine("Start result: {0}!", result);

    if (result == StartResult.Failed)
    {
    Console.WriteLine("Failed to start!");
    Console.ReadKey();
    return;
    }

    Console.WriteLine("Press key 'q' to stop it!");

    while (Console.ReadKey().KeyChar != 'q')
    {
    Console.WriteLine();
    continue;
    }

    Console.WriteLine();

    //Stop the appServer
    bootstrap.Stop();

    Console.WriteLine("The server was stopped!");
    Console.ReadKey();
    #endregion
    #region 编程启动
    //MyServer oilServer=new MyServer();
    //oilServer.Setup("127.0.0.1", 9200);
    //oilServer.Start();
    //Console.WriteLine("输入任意键结束...");
    //Console.ReadLine();
    //oilServer.Stop();
    #endregion
    }
    }

    /// <summary>
    /// 某个完整请求
    /// </summary>
    public class MyRequestInfo: RequestInfo<byte[]>
    {
    public MyRequestInfo(string key, byte[] body)
    : base(key, body)
    {

    }
    }

    /// <summary>
    /// 请求解析
    /// </summary>
    public class MyReceiveFilter : FixedHeaderReceiveFilter<MyRequestInfo>
    {
    public MyReceiveFilter(): base(4)//头部为4个字节
    {
    }

    protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length)
    {
    int len =
    BitConverter.ToInt32(
    new byte[] {header[offset + 3],header[offset+2], header[offset + 1], header[offset] }, 0);
    return len;
    }

    protected override MyRequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length)
    {
    var requestInfo= new MyRequestInfo(Guid.NewGuid().ToString(), bodyBuffer.CloneRange(offset, length));
    return requestInfo;
    }
    }
    /// <summary>
    /// 请求解析工厂
    /// </summary>
    public class MyReceiveFilterFactory : IReceiveFilterFactory<MyRequestInfo>
    {
    public IReceiveFilter<MyRequestInfo> CreateFilter(IAppServer appServer, IAppSession appSession, System.Net.IPEndPoint remoteEndPoint)
    {
    return new MyReceiveFilter();
    }
    }

    /// <summary>
    /// 某个socket会话
    /// </summary>
    public class MyOilSession : AppSession<MyOilSession, MyRequestInfo>
    {
    public MyOilSession()
    {
    this.Charset = System.Text.UTF8Encoding.UTF8;
    }
    public MyOilClient Client { get; private set; }
    protected override void OnSessionStarted()
    {
    //this.Client.SessionRegiste(this);
    base.OnSessionStarted();
    }

    protected override void OnSessionClosed(CloseReason reason)
    {
    //add your business operations
    //this.Client.SessionUnRegiste(this);
    }

    protected override void HandleUnknownRequest(MyRequestInfo requestInfo)
    {
    base.HandleUnknownRequest(requestInfo);
    }

    protected override void HandleException(Exception e)
    {
    base.HandleException(e);
    }

    protected override void OnInit()
    {
    base.OnInit();
    }

    public void NewRequestReceived(MyRequestInfo requestInfo)
    {
    int s = System.Threading.Thread.CurrentThread.GetHashCode();
    int k = s;
    var requestData = requestInfo.Body;
    }
    }
    public interface IDespatchServer
    {
    void DispatchMessage(IDespatchServer despatchServer, MyOilSession session, byte[] data);
    }
    /// <summary>
    /// 服务器端
    /// </summary>
    public class MyServer : AppServer<MyOilSession, MyRequestInfo>,IDespatchServer
    {
    public MyServer()
    : base(new MyReceiveFilterFactory())
    {
    base.NewSessionConnected += MyOilServer_NewSessionConnected;
    base.NewRequestReceived += MyOilServer_NewRequestReceived;
    base.SessionClosed += MyOilServer_SessionClosed;
    int s = System.Threading.Thread.CurrentThread.GetHashCode();
    int k = s;
    }

    void MyOilServer_SessionClosed(MyOilSession session, CloseReason value)
    {
    //throw new NotImplementedException();
    int s = System.Threading.Thread.CurrentThread.GetHashCode();
    int k = s;
    }

    void MyOilServer_NewRequestReceived(MyOilSession session, MyRequestInfo requestInfo)
    {
    //throw new NotImplementedException();
    session.NewRequestReceived(requestInfo);
    int s = System.Threading.Thread.CurrentThread.GetHashCode();
    int k = s;
    IDespatchServer iserver = null;
    switch (this.Name)
    {
    case "TelnetServerA":
    iserver = this.Bootstrap.GetServerByName("TelnetServerB") as IDespatchServer;
    break;
    case "TelnetServerB":
    iserver = this.Bootstrap.GetServerByName("TelnetServerC") as IDespatchServer;
    break;
    case "TelnetServerC":
    iserver = this.Bootstrap.GetServerByName("TelnetServerA") as IDespatchServer;
    break;
    }
    if(iserver!=null)
    iserver.DispatchMessage(this, session, requestInfo.Body);
    else
    {

    }
    }

    void MyOilServer_NewSessionConnected(MyOilSession session)
    {
    //throw new NotImplementedException();
    }

    protected override void OnStarted()
    {
    base.OnStarted();
    }
    protected override void OnStopped()
    {
    base.OnStopped();
    }

    public List<MyOilSession> Find(string loginCode)
    {
    var sessions = this.GetSessions(a =>a.Client!=null&& a.Client.LoginCode == loginCode);
    return sessions.ToList();
    }

    public void DispatchMessage(IDespatchServer despatchServer, MyOilSession session, byte[] data)
    {
    var sessions=this.GetAllSessions();
    foreach (var myOilSession in sessions)
    {
    myOilSession.Send(data, 0, data.Length);
    }
    }
    }

    public class MyOilClient
    {
    public string DeviceToken { get; set; }
    public string LoginCode { get; set; }
    public string OrgCode { get; set; }
    public Guid ClientID
    {
    get;
    private set;
    }
    public MyOilClientManager ClientManager { get; set; }
    public MyOilClient(Guid clientID)
    {
    this.ClientID = clientID;
    }
    /// <summary>
    /// 客户端的所有会话
    /// </summary>
    private List<MyOilSession> AllSessions = new List<MyOilSession>(1);

    public int SessionsCount
    {
    get
    {
    lock (AllSessions)
    {
    return AllSessions.Count;
    }
    }
    }
    /// <summary>
    /// 添加会话
    /// </summary>
    /// <param name="session"></param>
    public void SessionRegiste(MyOilSession session)
    {
    lock (AllSessions)
    {
    if (!AllSessions.Contains(session))
    AllSessions.Insert(0,session);
    }
    }

    public void SessionUnRegiste(MyOilSession session)
    {
    lock (AllSessions)
    {
    if (AllSessions.Contains(session))
    AllSessions.Remove(session);
    }
    }

    public bool Send(byte[] data, int offset, int length)
    {
    var session = GetEnableSession();
    if (session != null)
    {
    session.Send(data, offset, length);
    return true;
    }
    else
    {
    return false;
    }
    }
    public MyOilSession GetEnableSession()
    {
    lock (AllSessions)
    {
    foreach (var myOilSession in AllSessions)
    {
    if (myOilSession.Connected)
    {
    return myOilSession;
    }
    }
    }
    return null;
    }
    }

    public class MyOilClientManager
    {
    private List<MyOilClient> AllClients = new List<MyOilClient>();

    public void OilClientRegiste(MyOilClient client)
    {
    lock (AllClients)
    {
    if(!AllClients.Contains(client))
    AllClients.Add(client);
    }
    }

    public bool OilClientUnRegiste(MyOilClient client)
    {
    lock (AllClients)
    {
    if (AllClients.Contains(client))
    {
    AllClients.Remove(client);
    return true;
    }
    else
    {
    return false;
    }
    }
    }
    }
    }

  • 相关阅读:
    wget下载https文件,服务器可以虚拟机中不行的问题
    FTP被动模式服务器端开有限的端口
    ZOJ
    HDU
    JAVA 大数 A+B问题
    A Simple Math Problem(矩阵快速幂)----------------------蓝桥备战系列
    Covering(矩阵快速幂)
    卡特兰数详讲(转)
    Just a Hook(线段树区间修改值)-------------蓝桥备战系列
    A Simple Problem with Integers(线段树区间更新复习,lazy数组的应用)-------------------蓝桥备战系列
  • 原文地址:https://www.cnblogs.com/mazhlo/p/4071589.html
Copyright © 2011-2022 走看看