FastSocket.Net


Overview

FastSocket是一個輕量級易擴展的c#異步socket通信庫,項目開始於2011年,經過近3年不斷調整與改進,目前在功能和性能上均有不錯的表現。

項目地址:https://github.com/devhong/FastSocket.Net 

FastSocket內置了命令行、二進制、thrift協議,基於此開發了Zookeeper, Redis, Thrift等c#異步客戶端,接下來將會一一公開。

Requirements

.Net 4.0 or Mono 2.6 

Example Usage 

簡單的命令行服務

新建控制台項目,添加FastSocket.SocketBase,FastSocket.Server引用

自定義服務實現MyService

using System; using Sodao.FastSocket.Server; using Sodao.FastSocket.Server.Command; using Sodao.FastSocket.SocketBase; /// <summary>
/// 實現自定義服務 /// </summary>
public class MyService : CommandSocketService<StringCommandInfo> { /// <summary>
    /// 當連接時會調用此方法 /// </summary>
    /// <param name="connection"></param>
    public override void OnConnected(IConnection connection) { base.OnConnected(connection); Console.WriteLine(connection.RemoteEndPoint.ToString() + " connected"); connection.BeginSend(PacketBuilder.ToCommandLine("welcome")); } /// <summary>
    /// 當連接斷開時會調用此方法 /// </summary>
    /// <param name="connection"></param>
    /// <param name="ex"></param>
    public override void OnDisconnected(IConnection connection, Exception ex) { base.OnDisconnected(connection, ex); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(connection.RemoteEndPoint.ToString() + " disconnected"); Console.ForegroundColor = ConsoleColor.Gray; } /// <summary>
    /// 當發生錯誤時會調用此方法 /// </summary>
    /// <param name="connection"></param>
    /// <param name="ex"></param>
    public override void OnException(IConnection connection, Exception ex) { base.OnException(connection, ex); Console.WriteLine("error: " + ex.ToString()); } /// <summary>
    /// 處理未知命令 /// </summary>
    /// <param name="connection"></param>
    /// <param name="commandInfo"></param>
    protected override void HandleUnKnowCommand(IConnection connection, StringCommandInfo commandInfo) { commandInfo.Reply(connection, "unknow command:" + commandInfo.CmdName); } }

Exit命令

/// <summary>
/// 退出命令
/// </summary>
public sealed class ExitCommand : ICommand<StringCommandInfo>
{
    /// <summary>
    /// 返回命令名稱
    /// </summary>
    public string Name
    {
        get { return "exit"; }
    }
    /// <summary>
    /// 執行命令
    /// </summary>
    /// <param name="connection"></param>
    /// <param name="commandInfo"></param>
    public void ExecuteCommand(IConnection connection, StringCommandInfo commandInfo)
    {
        connection.BeginDisconnect();//斷開連接
    }
}

App.config配置

<?xml version="1.0"?>
<configuration>

  <configSections>
    <section name="socketServer"
             type="Sodao.FastSocket.Server.Config.SocketServerConfig, FastSocket.Server"/>
  </configSections>

  <socketServer>
    <servers>
      <server name="cmdline"
              port="8400"
              socketBufferSize="8192"
              messageBufferSize="8192"
              maxMessageSize="102400"
              maxConnections="20000"
              serviceType="CommandLine.MyService, CommandLine"
              protocol="commandLine"/>
    </servers>
  </socketServer>

</configuration>

初始化及啟動服務

static void Main(string[] args)
{
    SocketServerManager.Init();
    SocketServerManager.Start();

    Console.ReadLine();
}

啟動服務,然后在cmd中運行telnet 127.0.0.1 8400, 運行截圖如下:

其中welcome中當連接建立時服務端發送到終端的。

connection.BeginSend(PacketBuilder.ToCommandLine("welcome"));

unknow command:Hello是因為沒有對應的"Hello"命令實現由HandleUnKnowCommand輸出的

/// <summary>
/// 處理未知命令
/// </summary>
/// <param name="connection"></param>
/// <param name="commandInfo"></param>
protected override void HandleUnKnowCommand(IConnection connection, StringCommandInfo commandInfo)
{
    commandInfo.Reply(connection, "unknow command:" + commandInfo.CmdName);
}

當在終端中鍵入exit時,觸發了ExitCommand.ExecuteCommand方法,服務端主動斷開連接,終端退出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM