問題タブ [networkstream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 単体テストでNetworkStreamをmoqする方法は?
ユニットテストフレームワークとしてMoq&NUnitを使用しています。
NetworkStreamオブジェクトをパラメーターとして指定するメソッドを作成しました。
以前に作成されたテストは実際のNetworkStreamオブジェクトに依存しており、処理があまり適切ではないため、現在、このメソッドの単体テストを書き直すことを検討しています。
NetworkStreamをモックするにはどうすればよいですか?前述のようにMoqを使用しています。それは可能ですか?そうでない場合、この問題をどのように回避できますか?
フィードバックをお待ちしております。
以前の解決策は次の とおりです。
アップデート:
クラスをもう一度書き直しました。Stream
前のソリューションを使用した単体テストはうまくいきましたが、実際のアプリケーションの例では、オブジェクトをメソッドに渡すという(そうでなければ素晴らしい)提案を使用できない理由がわかりました。
まず、私のアプリケーションは一定のTCP接続に依存しています。を使用しStream.Read
(可能です)、受信するデータがない場合、実行がブロックされます。タイムアウトを指定すると、データが受信されない場合に例外がスローされます。この種の動作は、私が必要とする(かなり単純な)アプリケーションには受け入れられません。飾り気のない、一定のTCP接続が必要です。したがって、NetworkStream.DataAvailable
プロパティを持つことは私の実装にとって最も重要です。
現在の解決策:
最終的に、NetworkStreamへのインターフェイスとラッパーを作成しました。また、一時的な受信バッファーのバイト配列をメソッドに渡すことになりました。ユニットテストは今ではかなりうまく機能しています。
そして、これが私が使用する単体テストです:
.net - .NETを使用したTCPプログラミング
ソケットプログラミングジョブに問題があります。ソケット/ネットワークストリームを介してコマンドを送信するTCPクライアントを作成しました。私はWiresharkを使用して、ワイヤーを通過する生データを調べています。「コマンド」(つまり、ネットワークストリームをFlush()する)を送信するたびに、WiresharkアプリケーションはTCPヘッダーのチェックサムが正しくないことを通知します(「0x2440である必要がありますが、0x0000である必要があります)。ACKが返されます。 。アプリケーション層でTCPヘッダーを気にする必要がある理由がわかりません。それは正しくありません。なぜこの「エラー」が発生するのか誰かが知っていますか。私が知らない設定はありますか。 ?Tcpで.NET2.0ソケットを使用しています。ありがとうございます。
c# - C# NetworkStream.Read の奇妙さ
このコードの欠陥を指摘できる人はいますか? TcpClient で HTML を取得しています。IIS サーバーとの通信中に NetworkStream.Read() が終了しないようです。代わりに Fiddler プロキシを使用すると問題なく動作しますが、ターゲット サーバーと直接通信すると、「リモート サーバーが接続を閉じました」などのエラーで接続例外が発生するまで、.read() ループは終了しません。
アップデート
デバッガーでは、応答全体がすぐに送信され、StringBuilder (応答) に追加されていることがわかります。サーバーが応答の送信を完了したとき、または私のコードがそれを検出していないときに、接続が閉じられていないように見えます。
結論 ここで述べたように、トランザクションがいつ完了するかを判断するには、プロトコル (HTTP の場合は Content-Length ヘッダー) の機能を利用するのが最善です。ただし、すべてのページに content-length が設定されているわけではないことがわかりました。だから、私は今ハイブリッドソリューションを使用しています:
すべてのトランザクションの場合、リクエストの
Connection
ヘッダーを「close」に設定して、サーバーがソケットを開いたままにしないようにします。これにより、サーバーがリクエストへの応答中に接続を閉じる可能性が向上します。が設定されている場合
Content-Length
は、それを使用してリクエストがいつ完了するかを判断します。それ以外の場合は、NetworkStream の RequestTimeout プロパティを 1 秒などの大きな、しかし妥当な値に設定します。
NetworkStream.Read()
次に、 a) タイムアウトが発生するか、b) 要求したよりも少ないバイト数を読み取るまでループします。
すばらしい詳細な回答をくださった皆さんに感謝します。
c# - C#:NetworkStream.Peekを実装しますか?
現在、NetworkStream.Peek
C#にはメソッドがありません。NetworkStream.ReadByte
返さbyte
れたものが実際にから削除されないことを除いて、同じように機能するそのようなメソッドを実装するための最良の方法は何Stream
ですか?
c# - GZipStream、GZipStream から正しく読み取る方法
私はC#で私が書いたいくつかのコードを持っています
次に、この行に例外 InvalidDataException がありますint bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);
GZip ヘッダーのマジック ナンバーが正しくありません。
何か案は?
.net - Chr() を使用してテキストを解析する .Net
シンプルなクライアント サーバー チャット システムを構築しています。
クライアントはサーバーにデータを送信し、サーバーはそのデータを他のすべてのクライアントに再送信します。クライアントとサーバーの間でデータを送信するために、TcpListener および Network ストリーム クラスを使用しています。
送信する必要があるフィールドは、たとえば、名前、テキスト、タイムスタンプなどです。ASCII 文字 29 を使用して区切ります。
また、ストリーム データの終わりを示すために ASCII 文字 30 を使用しています。
データはUTF8でエンコードされています。
これは良いアプローチですか?問題が発生しますか? より良い方法はありますか?
アップデート:
おそらく私の質問は誤解されていたので、もっとよく説明します.クライアントからサーバーに送信するデータのリストがあり、すべてのデータを 1 つのストリームだけで送信するとします。これらのデータをどのように送信しますか?
- マークアップの使用
- 文字を区切り文字として使用する
- すべてのフィールドに固定長を使用する
c# - ストリームのみを気にしているのに、TcpClientを保存する必要がありますか?
TcpClientの新しいインスタンスがリモートホストに接続します。そのNetworkStreamが取得され、保存されます。ガベージコレクションされないように、TcpClient自体も保存する必要がありますか?
「破棄するには保存する必要があります」と答える場合:私の特定のケースでは、TcpClientは通常、長期間(アプリの存続期間)存続しているため、破棄する必要はありません。ただし、一般的に、Disposeを呼び出すためだけに保存する必要があることに同意します。
c# - .net TcpClient を使用して通信することにより、NetWorkStream がいつ終了するかを判断するにはどうすればよいですか?
stream.DataAvailable を使って終了かどうかを判断しようとしていますが、値が false になることがありますが、しばらくすると再び true になります。カウンターを設定して、このように記号 '>' で終了を判断する必要があります
それに対処する良い方法はありますか?ありがとう!
c# - StreamReaderの問題
さて、これが私がこれまでに持っているものです、
残念ながら、IRCダミーがパスワードが設定された部屋に入ると、#lol testなどのコマンドでチャネルを変更すると、パスワードが書き出されます。
CHANNEL = sであるため、テストはパスワードです。コマンドでパスワードを書き出す
これがIRCに書き出す唯一の方法なので、「CHANNEL」をテキストの先頭にし、#lolだけにして、パスワードを書き出さないようにする方法はありますか?
私の問題をご理解いただければ幸いです。
c# - TcpClient BeginRead/Send スレッドは安全ですか?
関連するネットワーク ストリームでTcpClient
非同期を呼び出した場合に.NET を使用すると、別のスレッドでそのストリームを呼び出すことはできますか?BeginRead()
Write()
またはlock()
、TcpClient
からコールバックされるBeginRead
コードと、送信を行うコードを使用する必要がありますか?
また、次のように閉じるTcpClient
と:
私もそうしなければなりませんlock()
かTcpClient
?