没有协议的c# SuperSocket

本文关键字:SuperSocket 协议 | 更新日期: 2023-09-27 17:51:22

问题很简单:我已经阅读了整个SuperSocket文档,但我不明白是否有一种方法可以使用它而不实现协议。

我不需要发送特定的命令,只需要发送字节,可能是一个或数百个,这取决于许多因素。我需要更新一个使用简单套接字的旧TCP服务器,它是我在4年前使用System.Net.Sockets库制作的,我想使用一个很好的库实现一个更强大的解决方案,如SuperSocket。

这是个好主意吗?

提前感谢。

没有协议的c# SuperSocket

您不需要实现协议,您可以通过实现接口来简单地创建ReceiveFilter: IReceiveFilter

所以首先创建一个自定义RequestInfo类,如下所示:

public class MyRequestInfo : IRequestInfo
{
    public string Key { get; set; }
    public string Unicode { get; set; }
    // You can add more properties here
}

然后创建ReceiveFilter - ReceiveFilter基本上是过滤所有传入消息的类。如果你不想实现一个协议,这就是你需要的。

public class MyReceiveFilter: IReceiveFilter<MyRequestInfo>
{
// This Method (Filter) is called whenever there is a new request from a connection/session 
//- This sample method will convert the incomming Byte Array to Unicode string
    public MyRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest)
    {
        rest = 0;
        try
        {
            var dataUnicode = Encoding.Unicode.GetString(readBuffer, offset, length);
            var deviceRequest = new MyRequestInfo { Unicode = dataUnicode };
            return deviceRequest;
        }
        catch (Exception ex)
        {
            return null;
        }
    }
    public void Reset()
    {
        throw new NotImplementedException();
    }
    public int LeftBufferSize { get; }
    public IReceiveFilter<MyRequestInfo> NextReceiveFilter { get; }
    public FilterState State { get; }
}

下一步是创建自定义AppSession。会话就像当客户端连接时,服务器为它创建一个会话,当客户端断开连接或服务器关闭连接时,会话被销毁。当您需要客户端连接,然后服务器必须发送确认,以便客户端发送下一个消息时,这是很好的情况。

public class MyAppSession : AppSession<MyAppSession, MyRequestInfo>
{
    // Properties related to your session.
    public int ClientKey { get; set; }
    public string SomeProperty { get; set; }
}
最后一步是创建您的自定义AppServer
// Here you will be telling the AppServer to use MyAppSession as the default AppSession class and the MyRequestInfo as the defualt RequestInfo
public class MyAppServer : AppServer<MyAppSession, MyRequestInfo>
{
// Here in constructor telling to use MyReceiveFilter and MyRequestInfo
    protected MyAppServer() : base(new DefaultReceiveFilterFactory<MyReceiveFilter, MyRequestInfo>())
    {
        NewRequestReceived += ProcessNewMessage;
    }
    // This method/event will fire whenever a new message is received from the client/session
    // After passing through the filter
    // the requestInfo will contain the Unicode string
    private void ProcessNewMessage(MyAppSession session, MyRequestInfo requestinfo)
    {
        session.ClientKey = SessionCount;
        // Here you can access the Unicode strings that where generated in the MyReceiveFilter.Filter() Method.
        Console.WriteLine(requestinfo.Unicode );
        // Do whatever you want
        session.Send("Hello World");

        session.Close();
    }
}

您还可以覆盖AppServer类的其他方法,如:OnSessionClosedOnNewSessionConnected

这就是它-然后你只需要初始化和启动服务器:

            var myAppServer = new MyAppServer();
            if (!myAppServer.Setup(2012))
            {
                _logger.LogMessage(MessageType.Error, string.Format("Failed to setup server"));
                return;
            }
            if (!myAppServer.Start())
            {
                _logger.LogMessage(MessageType.Error, string.Format("Failed to start server"));
                return;
            }