2016-04-19 16 views
0

私はC#.netのソケットプログラミングに関連しています。だから、あなたがリストを送信する前に長さに関する情報を送信しない限り、受信者はListの長さと何バイトの情報を送るべきかについての情報を持っていません。明らかな解決策)。 しかし、バイナリフォーマッタを使用すると、サイズについて心配する必要はありません。と私はこのアプローチを使用して多くのデータを送信できますか?には何らかの制限がありますか?これによりデータを送受信することが制限されています。バイナリフォーマッタ(ソケットプログラミング、TCPクライアント)を使用した送受信のデータ制限。

これは一部であり、データ

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

を送信するためにこれがFYI

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

...データを受信するためのものである:私は2+万オブジェクト、その作業罰金などのためにそれをテストしています。 私はこれを使い続けるべきですか?

答えて

0

NetworkStreamを使用する場合、サイズに関する技術的制限はlong.MaxValueです。 しかし、あなたはいくつかのことを考慮する必要があります。

  • 大きなデータのサイズは、ネットワーク・エラーの確率が高くなると、あなたのデータを取得するために失敗のその確率を送信します。いくつかのチャンクでデータを送信することを検討してください.1つのチャンクが失敗した場合、簡単に再送信できます。このように1Mbを送信することで、Okが送信され、1Gbを送信することが問題になります。
  • BinaryFormatterのシリアル化には、もう少し大きなヘッドがあり、転送されるサイズが大幅に増加します。場合によっては(あなたの実際のクラスとデータに応じて)、httpでJSONを送信する以上のこともあります。
  • ソケットをトランスポートとして選択することは、実行していることを最大限に制御し、深い最適化を行う必要がある場合に意味があります。単純なケースでは、WCFまたはWebAPIの使用を検討してください。
+0

私の要件は、WebAPIが問題にならないように、LANと非常に制御された通信を使用して通信することです。 1つのパケットが失われたり破損したりすると、TCPプロトコルがそれを処理しないのですか? – Ateeq

+0

@Ateeq、TCPは、いくつかのネットワークの問題を処理するために低レベルでいくつかの努力を払っていますが、最終的にはあなたのアプリケーションレベルでそれを処理する必要があります。あなたのケースでは、パケット全体を送受信できなかったことを意味します。 –

+0

@Ateeq、ソケットの使用につながる通信のどのようなコントロールが必要ですか? –

関連する問題