問題タブ [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 で読み取るデータがなくなったことを判断するにはどうすればよいですか?
TCP 接続を使用してサーバーに接続し、バイナリ ドキュメントを読み取り、それを応答オブジェクトに書き込む Web アプリがあります。つまり、カスタム プロトコルを使用してバックエンド サーバーからファイルを転送し、そのファイルを HTTP 経由でクライアントに返します。
サーバーはステータス コードと MIME タイプを送信します。これを正常に読み取り、ファイルの内容を書き込み、ソケットを閉じます。これはうまくいくようです。
クライアント (C# Web アプリ) は、データを読み取ります。
これは、すべてのデータが到着する前に常に読み取りループを終了するようです。私は何を間違っていますか?
.net - NetworkStream.DataAvailable はバッファリングされたデータを認識しますか?
NetworkStream.DataAvailable は、送信者の送信バッファが空かどうかを認識していますか? それとも、受信側の読み取りバッファにデータがあるかどうかを単に示していますか? 私の推測は後者です...
具体的には、進行中の会話を含む一部のソケット作業では、現在、受信者が現在のバッチ内のデータ量を正確に把握できるように、長さプレフィックスを使用しています。ただし、代わりに NetworkStream.DataAvailable を使用することを提案する .patch が送信されました。私の懸念は、これは送信者が最初に送信したものではなく、受信者が何を持っているかを教えてくれるだけだということですが、私はソケットの専門家ではありません。
私が間違っている?それとも、length-prefix が進むべき道ですか?
(複数のバッチが同じ接続で送信されるため、ストリームが閉じられるまで単純に Read() できないことに注意してください。各バッチを個別に扱うことが重要です。1 つのバッチで読みすぎた場合 (たとえそれがバッファリングされて破棄されます)、会話は中断されます)。
.net - Delphi7の.NETsNetworkStream/SslStreamのカウンターパート
.NETで安全なTCPサーバーを作成しました。これは基本的に、TcpListenerインスタンスを作成し、接続されたクライアントのNetworkStreamsをSslStreamsでラップするのと同じくらい簡単でした。
次に、Delphi 7(またはDelphi 2007)を使用してこのTCPサーバーにアクセスする必要があります。
ヘルプには何も見つかりませんでした。Google検索では、複雑な商用パッケージがたくさん表示されます。より簡単な解決策、または私が見落としていたDelphiに統合された何かがありますか?
そうでない場合、私が使用できる簡単な無料または商用パッケージはありますか?
c# - バイト配列から行を読み取ります(バイト配列を文字列に変換しません)
NetworkStreamから読み込んでいるバイト配列があります。最初の2バイトは後続のパケットの長さを示し、次にパケットはその長さのバイト配列に読み込まれます。NetworkStream / byte配列から読み取る必要があるデータには、いくつかの文字列があります。つまり、改行文字で終了する可変長データと、bytesやlongsなどの固定幅フィールドがあります。だから、このようなもの:
私は出くわすデータパケットのフォーマットを知っています(そしていくつかの意見があります)、そして私がする必要があるのは各文字列値の「行」を読み取ることですが、バイトとロングの固定数のバイトを読み取ります。これまでのところ、私の提案する解決策は、while
ループを使用して、改行文字ができるまでバイトを一時バイト配列に読み込むことです。次に、バイトを文字列に変換します。これは私には不器用に思えますが、別の明白な方法はわかりません。私は使用できることを認識していますStreamReader.ReadLine()
が、それは別のストリームを含み、私はすでにを持っていNetworkStream
ます。しかし、それがより良い解決策である場合、私はそれを試してみます。
私が検討したもう1つのオプションは、バックエンドチームに、これらの文字列値の長さに対して1バイトまたは2バイトを書き込んでもらい、長さを読み取ってから、指定された長さに基づいて文字列を読み取ることです。
ご覧のとおり、これを実行する方法についていくつかのオプションがあります。それを実行するための最良の方法を検討する方法について、ご意見をお聞かせください。これが、パケット全体を文字列として読み取るために今持っているコードです。次のステップは、パケットのさまざまなフィールドを分割し、パケット内のデータに基づいてオブジェクトの作成、UIの更新など、実行する必要のある実際のプログラミング作業を実行することです。
c# - ブロックせずにNetworkStream.Read()を呼び出す方法は?
ソケットの読み取りバッファを空にしたいので、次のコードを記述しました...
しかし、Read()メソッドがブロックされているため、tcpSocket.ReceiveTimeout=1を追加しました。。そして、それは以前と同じように機能します。
私が知っているように、これは通常C++で使用されます。どうすればこの問題を解決できますか?
c# - .NET NetworkStream 読み取りの遅さ
任意の TCP 接続を処理するためのネットワーク コードがいくつかあります。
すべてが期待どおりに機能しているように見えますが、遅いようです。コードのプロファイリングを行ったところ、NetworkStream.Read() で 600 ミリ秒を費やしているようで、改善方法を知りたいと思っています。私はバッファサイズをいじり、一度にすべてのデータを読み取る大規模なバッファと、データを連結して StringBuilder にする小さなバッファを交互に使用しました。現在、私が使用しているクライアントは Web ブラウザーですが、このコードは一般的なものであり、送信される HTTP データではない可能性があります。何か案は?
私のコードはこれです:
編集: 2 台のまったく別のマシン (私の XP 開発マシンと 2003 ボックスのコロコロ) でほぼ同じ数値が得られます。関連する部分のコードにタイミングを入れ (System.Diagnostic.StopWatch を使用)、ログにダンプしました。
.net - System.Net.Sockets.NetworkStreamの非同期読み取りコールバック
私はここで基本的な何かを誤解しているかもしれませんが...
セナリオ:System.Net.Sockets.NetworkStream
のメソッドを呼び出すBeginRead
と、マシンがネットワークデバイスから応答/要求を受信します。ランタイムは、独自のスレッドでコールバックを実行します。このスレッドが呼び出す前EndRead
に、マシンは別の応答/要求を受け取ります。
質問:ランタイムは別のスレッドでコールバックをすぐに呼び出しますか、それとも私が呼び出すのEndRead
を待ってからBeginRead
もう一度呼び出しますか?
.net - 非同期 IO スレッドを受信したのと同じ順序で完了するまで実行する
申し訳ありませんが、私はこのマルチスレッドのすべてに非常に慣れていません...
私はクライアント/サーバー アプリに取り組んでおり、System.Net.Sockets.NetworkStream
の Async IO メソッドを使用します。
BeginRead
を呼び出した後、システムがデータを受信するたびにコールバックの呼び出しを開始することを認識しています。コールバックが完了するまでにかなりの時間がかかる可能性がありますが、他のスレッドがこの同じコールバックを実行する前に完了する必要があります。
コールバック メソッドを同期済みとしてマークするだけで、システムがデータを受信した順序で各コールバック スレッドが完了するまで実行するのに十分でしょうか?
そうでない場合、どの同期ツールが最適でしょうか? (例: Monitor
s、WaitHandle
s、Semaphore
s? など...)
編集:これはWin Server 2008上のVB 2008にあります
c# - NetworkStream、SerialPort の DataReceived に似たものはありますか? (C#)
わかりました、なぜこれがどこにも見つからないのか、またはそれが存在しない場合、なぜマイクロソフトはそれを実装していないのか、少し混乱していますか?
これが私のシナリオです。私は、DataAvailable という素敵な小さなブール値を持つ NetworkStream を持っています。必要なのは、飛び出して「ねえ、利用可能なデータがあります!」と言うイベントです。(私は怠け者であり、「実際、今回はあります」という応答が得られるまで、「わかりました、利用可能なデータはありますか?」と何度も何度も尋ね続けるよりも、利用可能なデータがあると言われたいからです)。
SerialPort に似たもの (いいイベント (DataReceived) があり、データがポートから受信されていることを親切に知らせてくれます) がいいでしょう。しかし、私は NetworkStream でソケットを使用しています。
私が欠けていることが露骨に明らかな何かがある場合は正しい方向に向けてください。そうでない場合は、DataAvailable プロパティでデータバインディングを使用する必要があり、それが true に設定されている場合は、私の独自の「自家製」イベント/機能? これがその方法である場合、ボールを転がすための小さな例を教えてください。
編集
私の完璧な答えは、誰かが来て、SerialPort で使用される DataReceived イベントに非常に似ているが、NetworkStream を介してストリーミングしている Socket 用に実装されたものを見つける/作成する方法を説明することです!
よろしくお願いします。
c# - 閉じたNetworkStreamを再度開きますか?
おはようございます、
アドバイスが必要です。TcpClientからストリーミングしているnetworkStreamを使用していますが、すべて正常に機能していましたが、ストリームを閉じる必要がある他の場所でいくつかの機能が必要でした。接続を閉じた後、接続を再度開く方法が見つからないようです。誰かが私をここで正しい方向に向けることができますか?
これが私が基づいているコードの例です:(明らかにこれは正確にそれがどのように機能するかではありませんが、私はそれを可能な限り単純化しました:-))
よろしくお願いします。
編集-変数のスペル名を変更しました!おっと!
編集-申し訳ありませんが、問題が他の場所から発生していることに気づきました。このコードが正しいことを確認していただきありがとうございます:-)別のソースから問題を見つけるのに役立ちました