1

私は.NETでクライアントサーバーアプリを作成していますが、何かを送信しようとすると、クライアントがそれを読んでいて、読んでいる間に何か他のものを送信しているため、送信されたデータのがらくたになるという問題が発生しました。

例:

  1. テスト送信します
  2. クライアントが読み始める
  3. エンドテストを送ります
  4. クライアントは test@$>@est を読み取ります

これを解決する方法はありますか?今、私は送信後にやっていThread.Sleep(10)ますが、もっと良い方法があると思います:P.

PS私が使用しているのはNetworkStream.Write()/Read()、ではありませんNetworkStream.BeginWrite()/BeginRead()。これらの 2 つのどちらが優れているか、またその理由は何ですか?

4

3 に答える 3

1

問題は、同じソケットを使用して複数の「モノ」のデータを送信していることである可能性があります。文字列を送信してから画像を送信したことをご存知かもしれませんが、TCPは個別のオブジェクトを認識せず、バイトの単一ストリームのみを認識します。

また、「最初の」データオブジェクトを取得するために必要な読み取り呼び出しの数もわかりません。複数のオブジェクトを描写することは、TCPの範囲外です。重要なのは、この問題は、トランザクションごとに1つのソケットを使用することで最もよく解決されるということです。ソケットを作成し、1回の書き込み呼び出しでデータ全体をソケットに書き込んでから、ソケットを閉じます。データ全体が揃うまで、クライアントに読んでもらいます。他のものを送る必要がある場合は、新しいソケットを作成してください。

これがNetworkStreamクラスに固有のものではないことは知っていますが、お役に立てば幸いです。

于 2010-12-20T08:05:42.510 に答える
0

もし私があなたなら、データを送受信するときにルールを作成します。たとえば、$のような開始文字があり、*は終了文字です。これにより、クライアント/サーバーシステムは、いつ読み取りまたはいつ書き込みを行うかを認識し、最終的にはプロセスでのガベージを回避できます。したがって、手順の観点から:

  • クライアントがメッセージ$helloworld*を送信します
  • サーバーは$を確認すると読み取りを開始し、*の後に停止します。

繰り返しになりますが、あなたがしていることのコード例は、あなたが間違っていることを正確に特定するのに役立つかもしれません。

于 2010-12-20T08:09:15.623 に答える
0

特に両端(クライアント/サーバー)がC#にある場合は、この種のものにnettcpbindingでWCFを使用することを検討する必要があります。

私は以前、カスタム tcp コードを作成する際に同様の問題を抱えていましたが、wcf に移行したところ、はるかに簡単で安定しているため、アプリケーション コードの作成に専念できます。

于 2010-12-20T08:01:14.127 に答える