2016-06-27 7 views
3

Die Frage ist einfach: Ich habe die ganze SuperSocket Dokumentation gelesen, aber ich verstehe nicht, wenn es eine Möglichkeit gibt, es zu verwenden, ohne ein Protokoll zu implementieren.C# SuperSocket ohne Protokoll

Ich brauche nicht bestimmte Befehle, sondern nur Bytes, die eine oder Hunderte sein können, abhängig von vielen Faktoren. Ich muss einen alten TCP-Server, der einfache Sockets verwendet, erneuern, er wurde von mir mit System.Net.Sockets-Bibliotheken vor mehr als 4 Jahren erstellt und ich würde gerne eine stärkere Lösung mit einer guten Notizbibliothek als SuperSocket verwenden.

Ist es eine gute Idee?

Vielen Dank im Voraus.

+0

was meinst du, ohne ein Protokoll zu implementieren? Super Socket verwendet entweder TCP oder UDP, abhängig von der Konfiguration –

+0

Nun, offensichtlich verwendet es TCP und UDP als Transport-Level-Protokoll. Aber beim Lesen der Dokumentation scheint es, dass Sie ein Kommunikationsprotokoll entwickeln müssen, um Daten zu kapseln. Wenn Sie [hier] (http://docs.supersocket.net/v1-6/en-US/The-Built-in-Command-Line-Protocol) schauen, können Sie lesen, was ich meine. Die erste Frage auf der Seite hat genau die Antwort auf Ihre Frage. Ich lese _Sie müssen Ihr Anwendungsprotokoll definieren ..._, das scheint obligatorisch. Danke. – tedebus

+0

Möchten Sie nur die Daten als Bytes erhalten? –

Antwort

7

Sie müssen kein Protokoll implementieren, Sie können einfach ReceiveFilter erstellen, indem Sie die Schnittstelle implementieren: IReceiveFilter.

Also zunächst eine benutzerdefinierte Request Klasse wie unten erstellen:

public class MyRequestInfo : IRequestInfo 
{ 
    public string Key { get; set; } 
    public string Unicode { get; set; } 

    // You can add more properties here 
} 

dann die ReceiveFilter schaffen - die ReceiveFilter im Grunde die Klasse, die alle eingehenden Nachrichten filtert. Dies ist erforderlich, wenn Sie kein Protokoll implementieren möchten.

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

Nächster Schritt ist eine benutzerdefinierte AppSession erstellen. Sitzung ist wie wenn ein Client eine Verbindung herstellt Der Server erstellt eine Sitzung für ihn und wird zerstört, wenn der Client die Verbindung trennt oder wenn der Server die Verbindung schließt. Dies ist für Situationen nützlich, in denen der Client eine Verbindung herstellen muss und der Server dann ACKnowledgment senden muss, damit der Client die nächste Nachricht senden kann.

public class MyAppSession : AppSession<MyAppSession, MyRequestInfo> 
{ 
    // Properties related to your session. 

    public int ClientKey { get; set; } 

    public string SomeProperty { get; set; } 

} 

Und der letzte Schritt ist Ihre benutzerdefinierten AppServer

kann
// 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(); 
    } 
} 

Sie auch andere Methoden der AppServer Klasse außer Kraft zu schaffen wie: OnSessionClosed oder OnNewSessionConnected

Das ist es - dann nur Sie haben zum Initialisieren und Starten des Servers:

  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

Danke, ich werde es versuchen. [Bearbeiten] Tut mir leid, aber ich kann deine Antwort nicht verbessern, weil mein Ruf nicht hoch genug ist. :( Ich werde es in Zukunft tun, wenn ich kann. Ich verspreche. – tedebus

+1

Wie ich versprochen, nach mehr als 1 Jahr ... Ich kann Ihre Antwort aufheben!;) – tedebus