如何将SuperSocket封装成C语言接口?

2026-04-27 13:501阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计965个文字,预计阅读时间需要4分钟。

如何将SuperSocket封装成C语言接口?

将SuperSocket封装成类库后,可以将其集成进各种类型的应用,而不仅限于控制台应用程序。这里以TelnetServer为例,说明如何进行操作。

首先,创建一个TelnetServer类:

pythonclass TelnetServer: def __init__(self, host, port): self.host=host self.port=port

def start(self): print(fStarting TelnetServer on {self.host}:{self.port})

def stop(self): print(fStopping TelnetServer on {self.host}:{self.port})

def send_message(self, message): print(fSending message: {message})

然后,使用该类创建一个实例,并调用其方法:

pythonif __name__==__main__: server=TelnetServer(localhost, 1234) server.start() server.send_message(Hello, Telnet!) server.stop()

将SuperSocket封装成类库之后可以将其集成进各种类型的应用,而不仅仅局限于控制台应用程序了,从而应用于不同的场景。这里以TelnetServer为例说明如何进行操作。

首先,创建一个C#类库项目LibSocketServer

添加SuperSocket引用(SuperSocket.Common.dll,SuperSocket.SocketBase.dll,SuperSocket.SocketEngine.dll),添加默认的日志框架log4net.dll引用。将log4net.config拷贝到项目文件夹的“Config”文件夹,然后设置它的“生成操作”为“内容”,设置它的“复制到输出目录”为“如果较新则复制”。

其次,添加SuperSocket完整的TelnetServer服务相关类,Socket服务管理类SocketServerManager。

其中SocketServerManager对Bootstrap的设置是SuperSocket封装为类库的关键。

TelnetSession.cs

如何将SuperSocket封装成C语言接口?

using System; using SuperSocket.SocketBase; using SuperSocket.SocketBase.Protocol; namespace LibSocketServer.Server { public class TelnetSession : AppSession<TelnetSession> { protected override void OnSessionStarted() { Console.WriteLine($"New Session Connected: {RemoteEndPoint.Address} " + $"@ {RemoteEndPoint.Port}."); Send("Welcome to SuperSocket Telnet Server."); } protected override void HandleUnknownRequest(StringRequestInfo requestInfo) { Console.WriteLine($"Unknown request {requestInfo.Key}."); Send("Unknown request."); } protected override void HandleException(Exception e) { Console.WriteLine($"Application error: {e.Message}."); Send($"Application error: {e.Message}."); } protected override void OnSessionClosed(CloseReason reason) { Console.WriteLine($"Session {RemoteEndPoint.Address} @ {RemoteEndPoint.Port} " + $"Closed: {reason}."); base.OnSessionClosed(reason); } } }

TelnetServer.cs

using System; using SuperSocket.SocketBase; using SuperSocket.SocketBase.Config; namespace LibSocketServer.Server { public class TelnetServer : AppServer<TelnetSession> { protected override bool Setup(IRootConfig rootConfig, IServerConfig config) { Console.WriteLine("TelnetServer Setup"); return base.Setup(rootConfig, config); } protected override void OnStarted() { Console.WriteLine("TelnetServer OnStarted"); base.OnStarted(); } protected override void OnStopped() { Console.WriteLine(); Console.WriteLine("TelnetServer OnStopped"); base.OnStopped(); } } }

AddCommand.cs

using System; using System.Linq; using LibSocketServer.Server; using SuperSocket.SocketBase.Command; using SuperSocket.SocketBase.Protocol; namespace LibSocketServer.Command { public class AddCommand : CommandBase<TelnetSession, StringRequestInfo> { public override string Name => "ADD"; public override void ExecuteCommand(TelnetSession session, StringRequestInfo requestInfo) { Console.WriteLine($"{Name} command: {requestInfo.Body}."); session.Send(requestInfo.Parameters.Select(p => Convert.ToInt32(p)).Sum().ToString()); } } }

EchoCommand.cs

using System; using LibSocketServer.Server; using SuperSocket.SocketBase.Command; using SuperSocket.SocketBase.Protocol; namespace LibSocketServer.Command { public class EchoCommand : CommandBase<TelnetSession, StringRequestInfo> { public override string Name => "ECHO"; public override void ExecuteCommand(TelnetSession session, StringRequestInfo requestInfo) { Console.WriteLine($"{Name} command: {requestInfo.Body}."); session.Send(requestInfo.Body); } } }

SocketServerManager.cs

using System; using System.Reflection; using SuperSocket.SocketBase; using SuperSocket.SocketEngine; namespace LibSocketServer { public class SocketServerManager { private readonly IBootstrap _bootstrap; public bool Startup(int port) { if (!_bootstrap.Initialize()) { Console.WriteLine("SuperSocket Failed to initialize!"); return false; } var ret = _bootstrap.Start(); Console.WriteLine($"SuperSocket Start result: {ret}."); return ret == StartResult.Success; } public void Shutdown() { _bootstrap.Stop(); } #region Singleton private static SocketServerManager _instance; private static readonly object LockHelper = new object(); private SocketServerManager() { var location = Assembly.GetExecutingAssembly().Location; var configFile = $"{location}.config"; _bootstrap = BootstrapFactory.CreateBootstrapFromConfigFile(configFile); } public static SocketServerManager Instance { get { if (_instance != null) { return _instance; } lock (LockHelper) { _instance = _instance ?? new SocketServerManager(); } return _instance; } } #endregion } }

再次,添加配置文件App.config到类库中,并设置其配置参数。

<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/> </configSections> <!-- SuperSocket配置的根节点 --> <superSocket> <!-- 服务器实例 --> <servers> <server name="TelnetServer" serverTypeName="TelnetServerType" ip="Any" port="2021"></server> </servers> <!-- 服务器类型 --> <serverTypes> <add name="TelnetServerType" type="LibSocketServer.Server.TelnetServer, LibSocketServer" /> </serverTypes> </superSocket> </configuration>

最后,创建控制台项目TelnetServerSample,添加项目引用LibSocketServer,然后在Program类中使用SocketServerManager进行SuperSocket的调用。

Program.cs

using System; using LibSocketServer; namespace TelnetServerSample { class Program { static void Main() { try { //启动SuperSocket if (!SocketServerManager.Instance.Startup(2021)) { Console.WriteLine("Failed to start TelnetServer!"); Console.ReadKey(); return; } Console.WriteLine("TelnetServer is listening on port 2021."); Console.WriteLine(); Console.WriteLine("Press key 'q' to stop it!"); Console.WriteLine(); while (Console.ReadKey().KeyChar.ToString().ToUpper() != "Q") { Console.WriteLine(); } //关闭SuperSocket SocketServerManager.Instance.Shutdown(); } catch (Exception e) { Console.WriteLine("Exception: {0}", e.Message); } Console.WriteLine(); Console.WriteLine("TelnetServer was stopped!"); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } } }

GitHub Sample

以上就是SuperSocket封装成C#类库的步骤的详细内容,更多关于SuperSocket封装成C#类库的资料请关注自由互联其它相关文章!

标签:步骤Sup

本文共计965个文字,预计阅读时间需要4分钟。

如何将SuperSocket封装成C语言接口?

将SuperSocket封装成类库后,可以将其集成进各种类型的应用,而不仅限于控制台应用程序。这里以TelnetServer为例,说明如何进行操作。

首先,创建一个TelnetServer类:

pythonclass TelnetServer: def __init__(self, host, port): self.host=host self.port=port

def start(self): print(fStarting TelnetServer on {self.host}:{self.port})

def stop(self): print(fStopping TelnetServer on {self.host}:{self.port})

def send_message(self, message): print(fSending message: {message})

然后,使用该类创建一个实例,并调用其方法:

pythonif __name__==__main__: server=TelnetServer(localhost, 1234) server.start() server.send_message(Hello, Telnet!) server.stop()

将SuperSocket封装成类库之后可以将其集成进各种类型的应用,而不仅仅局限于控制台应用程序了,从而应用于不同的场景。这里以TelnetServer为例说明如何进行操作。

首先,创建一个C#类库项目LibSocketServer

添加SuperSocket引用(SuperSocket.Common.dll,SuperSocket.SocketBase.dll,SuperSocket.SocketEngine.dll),添加默认的日志框架log4net.dll引用。将log4net.config拷贝到项目文件夹的“Config”文件夹,然后设置它的“生成操作”为“内容”,设置它的“复制到输出目录”为“如果较新则复制”。

其次,添加SuperSocket完整的TelnetServer服务相关类,Socket服务管理类SocketServerManager。

其中SocketServerManager对Bootstrap的设置是SuperSocket封装为类库的关键。

TelnetSession.cs

如何将SuperSocket封装成C语言接口?

using System; using SuperSocket.SocketBase; using SuperSocket.SocketBase.Protocol; namespace LibSocketServer.Server { public class TelnetSession : AppSession<TelnetSession> { protected override void OnSessionStarted() { Console.WriteLine($"New Session Connected: {RemoteEndPoint.Address} " + $"@ {RemoteEndPoint.Port}."); Send("Welcome to SuperSocket Telnet Server."); } protected override void HandleUnknownRequest(StringRequestInfo requestInfo) { Console.WriteLine($"Unknown request {requestInfo.Key}."); Send("Unknown request."); } protected override void HandleException(Exception e) { Console.WriteLine($"Application error: {e.Message}."); Send($"Application error: {e.Message}."); } protected override void OnSessionClosed(CloseReason reason) { Console.WriteLine($"Session {RemoteEndPoint.Address} @ {RemoteEndPoint.Port} " + $"Closed: {reason}."); base.OnSessionClosed(reason); } } }

TelnetServer.cs

using System; using SuperSocket.SocketBase; using SuperSocket.SocketBase.Config; namespace LibSocketServer.Server { public class TelnetServer : AppServer<TelnetSession> { protected override bool Setup(IRootConfig rootConfig, IServerConfig config) { Console.WriteLine("TelnetServer Setup"); return base.Setup(rootConfig, config); } protected override void OnStarted() { Console.WriteLine("TelnetServer OnStarted"); base.OnStarted(); } protected override void OnStopped() { Console.WriteLine(); Console.WriteLine("TelnetServer OnStopped"); base.OnStopped(); } } }

AddCommand.cs

using System; using System.Linq; using LibSocketServer.Server; using SuperSocket.SocketBase.Command; using SuperSocket.SocketBase.Protocol; namespace LibSocketServer.Command { public class AddCommand : CommandBase<TelnetSession, StringRequestInfo> { public override string Name => "ADD"; public override void ExecuteCommand(TelnetSession session, StringRequestInfo requestInfo) { Console.WriteLine($"{Name} command: {requestInfo.Body}."); session.Send(requestInfo.Parameters.Select(p => Convert.ToInt32(p)).Sum().ToString()); } } }

EchoCommand.cs

using System; using LibSocketServer.Server; using SuperSocket.SocketBase.Command; using SuperSocket.SocketBase.Protocol; namespace LibSocketServer.Command { public class EchoCommand : CommandBase<TelnetSession, StringRequestInfo> { public override string Name => "ECHO"; public override void ExecuteCommand(TelnetSession session, StringRequestInfo requestInfo) { Console.WriteLine($"{Name} command: {requestInfo.Body}."); session.Send(requestInfo.Body); } } }

SocketServerManager.cs

using System; using System.Reflection; using SuperSocket.SocketBase; using SuperSocket.SocketEngine; namespace LibSocketServer { public class SocketServerManager { private readonly IBootstrap _bootstrap; public bool Startup(int port) { if (!_bootstrap.Initialize()) { Console.WriteLine("SuperSocket Failed to initialize!"); return false; } var ret = _bootstrap.Start(); Console.WriteLine($"SuperSocket Start result: {ret}."); return ret == StartResult.Success; } public void Shutdown() { _bootstrap.Stop(); } #region Singleton private static SocketServerManager _instance; private static readonly object LockHelper = new object(); private SocketServerManager() { var location = Assembly.GetExecutingAssembly().Location; var configFile = $"{location}.config"; _bootstrap = BootstrapFactory.CreateBootstrapFromConfigFile(configFile); } public static SocketServerManager Instance { get { if (_instance != null) { return _instance; } lock (LockHelper) { _instance = _instance ?? new SocketServerManager(); } return _instance; } } #endregion } }

再次,添加配置文件App.config到类库中,并设置其配置参数。

<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/> </configSections> <!-- SuperSocket配置的根节点 --> <superSocket> <!-- 服务器实例 --> <servers> <server name="TelnetServer" serverTypeName="TelnetServerType" ip="Any" port="2021"></server> </servers> <!-- 服务器类型 --> <serverTypes> <add name="TelnetServerType" type="LibSocketServer.Server.TelnetServer, LibSocketServer" /> </serverTypes> </superSocket> </configuration>

最后,创建控制台项目TelnetServerSample,添加项目引用LibSocketServer,然后在Program类中使用SocketServerManager进行SuperSocket的调用。

Program.cs

using System; using LibSocketServer; namespace TelnetServerSample { class Program { static void Main() { try { //启动SuperSocket if (!SocketServerManager.Instance.Startup(2021)) { Console.WriteLine("Failed to start TelnetServer!"); Console.ReadKey(); return; } Console.WriteLine("TelnetServer is listening on port 2021."); Console.WriteLine(); Console.WriteLine("Press key 'q' to stop it!"); Console.WriteLine(); while (Console.ReadKey().KeyChar.ToString().ToUpper() != "Q") { Console.WriteLine(); } //关闭SuperSocket SocketServerManager.Instance.Shutdown(); } catch (Exception e) { Console.WriteLine("Exception: {0}", e.Message); } Console.WriteLine(); Console.WriteLine("TelnetServer was stopped!"); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } } }

GitHub Sample

以上就是SuperSocket封装成C#类库的步骤的详细内容,更多关于SuperSocket封装成C#类库的资料请关注自由互联其它相关文章!

标签:步骤Sup