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方法,服務端主動斷開連接,終端退出。