2016-06-27 2 views
3

Вопрос прост: я прочитал всю документацию SuperSocket, но я не понимаю, есть ли способ использовать ее без реализации протокола.C# SuperSocket без протокола

Мне не нужно отправлять конкретные команды, но только байты, которые могут быть один или сотни, в зависимости от многих факторов. Мне нужно обновить старый TCP-сервер, который использует простые сокеты, он был сделан мной, используя System.Net.Sockets libs более 4 лет назад, и я хотел бы реализовать более сильное решение, используя библиотеку с замечательными примечаниями, такую ​​как SuperSocket.

Это хорошая идея?

Заранее спасибо.

+0

Что вы имеете в виду без реализации протокола? Super Socket будет использовать TCP или UDP в зависимости от конфигурации. –

+0

Ну, очевидно, он использует TCP и UDP в качестве протокола транспортного уровня. Но, читая документацию, кажется, что вам необходимо разработать протокол связи для инкапсуляции данных. Если вы посмотрите [здесь] (http://docs.supersocket.net/v1-6/en-US/The-Built-in-Command-Line-Protocol), вы можете прочитать, что я имею в виду. Первый вопрос на странице имеет именно ответ на ваш вопрос. Я читаю: вам нужно определить протокол уровня приложения ..., это кажется обязательным. Спасибо. – tedebus

+0

Вы просто хотите получить данные в виде байтов? –

ответ

7

Вам не нужно реализовывать протокол, вы можете просто создать 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. Сессия похожа, когда клиент подключается, сервер создает для нее сеанс и уничтожается, когда клиент отключается или когда сервер закрывает соединение. Это хорошо для ситуаций, когда вам нужен клиент для подключения, а затем сервер должен отправить ACKnowledgment для отправки клиентом следующего сообщения.

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 как: OnSessionClosed или OnNewSessionConnected

Вот это - то вы просто для инициализации и запуска сервера:

  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; 
      } 
+0

Спасибо, я попробую. [править] Извините, но я не могу поддержать ваш ответ, потому что моя репутация недостаточно высока. :( Я сделаю это в будущем, когда смогу. Обещаю. – tedebus

+1

Как я и обещал, после более чем 1 года ... Я могу поддержать свой ответ!;) – tedebus