2016-04-19 2 views
0

Ich mache etwas Arbeit Im Zusammenhang mit Socket-Programmierung in C# .net. Wenn Sie also Objektlisten über den Socket senden möchten (offensichtlich in Bytes), dann hat der Empfänger keine Informationen über die Länge von List und wie viele Bytes er lesen sollte, außer Sie senden Informationen über die Länge vor dem Senden der Liste (einfach und offensichtliche Lösung). Aber was ist, wenn ich Binary Formatter verwende, muss ich mir keine Gedanken über die Größe machen. und kann ich so viele Daten senden, wie ich möchte, mit diesem Ansatz, gibt es irgendein Limit? Beschränken, um Daten zu senden und zu empfangen.Daten Beschränkung auf senden und empfangen mit Binary Formatter (Socket-Programmierung, TCP-Client). NET

Dies ist Teil für das Senden von Daten

    TcpClient client = new System.Net.Sockets.TcpClient(serverip, serverport); 
       NetworkStream ns = client.GetStream(); 
       IFormatter formatter = new BinaryFormatter(); 
       formatter.Serialize(ns, List<Object>); 

Dies ist zum Empfangen von Daten ..

   List<Object> list=(List<Object>)formatter.Deserialize(ns); 

FYI: ich es wie 2+ Millionen Objekte getestet haben, seine Arbeit gut. Sollte ich das weiter verwenden?

Antwort

0

Da Sie NetworkStream verwenden, ist die technische Begrenzung für die Größe lang.MaxValue. Aber Sie sollten mehrere Dinge berücksichtigen:

  • Je größer die Größe der Daten Ihrer Sende die höhere Wahrscheinlichkeit von Netzwerkfehlern und dafür Ausfallwahrscheinlichkeit Ihre Daten zu erhalten. Ziehen Sie in Betracht, Daten in einigen Chunks zu senden. Wenn also ein Chunk fehlschlägt, können Sie ihn einfach erneut senden. Kurz gesagt, 1Mb auf diese Weise zu senden ist OK, das Senden von 1 GB ist ein Problem.
  • Die BinaryFormatter-Serialisierung hat einige große Kopf und Zunahme der übertragenen Größe erheblich. In einigen Fällen (abhängig von den tatsächlichen Klassen und Daten) könnte es sogar mehr sein, als JSON über http zu senden.
  • Die Auswahl von Sockets als Transport ist sinnvoll, wenn Sie die maximale Kontrolle über das, was Sie gerade tun, benötigen und eine tiefgreifende Optimierung vornehmen. Verwenden Sie in einfacheren Fällen WCF oder WebAPI.
+0

Meine Anforderung ist die Kommunikation über LAN und eine sehr kontrollierte Kommunikation, so dass WebAPI nicht in Frage kommt. und Lets sagen, ich sende 1 GB und wenn 1 Paket verloren oder beschädigt ist, ist nicht TCP-Protokoll kümmert sich darum? – Ateeq

+0

@Ateeq, TCP unternimmt einige Anstrengungen auf niedriger Ebene, um mit einigen Netzwerkproblemen fertig zu werden, aber wenn es schließlich fehlschlägt, sollten Sie es auf Ihrer App-Ebene selbst behandeln. In Ihrem Fall bedeutet das, dass Sie Ihr gesamtes Paket nicht gesendet oder empfangen haben. –

+0

@Ateeq, welche Art von Kontrolle benötigen Sie über Ihre Kommunikation, die zur Verwendung von Sockets führt? –

Verwandte Themen