問題タブ [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.

0 投票する
2 に答える
269 参照

c# - NetworkStream 経由で一度に送信される最小保証バイト数

TcpClient の NetworkStream を使用して、バイトを .NET サーバーから、Socket 経由で受信する Silverlight クライアントに送信しています。クライアントからの送信は、Socket.SendAsync を介して行われます。

私の質問は、メッセージの長さを送信して自分でいくつかのバイトメッセージをまとめる必要なしに、両側で「一度に」受信できると予想できる最小バイト数はどれくらいかということです。

ありがとう、アンドレイ

0 投票する
8 に答える
24623 参照

c# - TcpClient.GetStream().DataAvailable は false を返しますが、ストリームにはさらにデータがあります

そのため、ブロッキング Read() は、送信されたすべてのデータの受信が完了する前に戻る可能性があるように見えます。次に、問題のストリームからの DataAvailable 値によって制御されるループで Read() をラップします。問題は、この while ループ内でより多くのデータを受信できることですが、システムにこれを知らせるための舞台裏の処理が行われていないことです。私がネット上で見つけた解決策のほとんどは、何らかの形で私には適用できませんでした.

私がやったことは、ループの最後のステップとして、ストリームから各ブロックを読み取った後に単純な Thread.Sleep(1) を実行することです。これはシステムを更新する時間を与えているようで、正確な結果が得られていませんが、これは少しハックで、解決策としてはかなり「状況に応じた」ものに思えます。

私が対処している状況のリストを次に示します。 IIS アプリケーションとスタンドアロン アプリケーションの間の単一の TCP 接続。どちらも送受信通信用に C# で記述されています。リクエストを送信し、レスポンスを待ちます。このリクエストは HTTP リクエストによって開始されますが、HTTP リクエストからデータを読み取るこの問題は発生していません。事後です。

着信接続を処理するための基本的なコードは次のとおりです

より良い解決策のためのすべてのフィードバックを歓迎します。または、DataAvailable の値を確認する前に、適切に更新できるようにするために Sleep(1) を実行する必要があることを歓迎します。

2年後、この質問に対する答えが今の状況ではないことを願っています:)

0 投票する
4 に答える
15956 参照

c# - NetworkStream.Read() と NetworkStream.BeginRead() の違いは?

NetworkStreamデータをランダムに送信するものを読み取る必要があり、データパケットのサイズも変化し続けます。各スレッドが独自のストリームを読み取るマルチスレッド アプリケーションを実装しています。ストリームにデータがない場合、アプリケーションはデータが到着するまで待機し続ける必要があります。ただし、サーバーがデータの送信を完了し、セッションを終了した場合は、終了する必要があります。

最初はこのReadメソッドを使用してストリームからデータを取得していましたが、以前はスレッドをブロックし、データがストリームに現れるまで待機し続けていました。

MSDN のドキュメントでは、

読み取りに使用できるデータがない場合、Read メソッドは 0 を返します。リモート ホストが接続をシャットダウンし、使用可能なデータがすべて受信されている場合、Read メソッドはすぐに完了し、0 バイトを返します。

しかし、私の場合、Read0 を返して正常に終了するメソッドを取得したことがありません。無期限に待つだけです。

さらに調査したところBeginRead、ストリームを監視し、データを受信するとすぐにコールバック メソッドを非同期で呼び出すことがわかりました。このアプローチを使用してさまざまな実装を探してみましたがBeginReadRead.

私が見ているようにBeginRead、現在のスレッドをブロックしない非同期呼び出しがあるという利点があります。しかし、私のアプリケーションでは、ストリームからデータを読み取って処理するための別のスレッドが既にあるため、それほど大きな違いはありません。

  • BeginReadの待機と終了のメカニズムと、それとの違いを理解するのを手伝ってもらえます Readか?

  • 必要な機能を実装するための最良の方法は何ですか?

0 投票する
1 に答える
1219 参照

c# - NetworkStreamから読み取るバイト配列/バッファのサイズを見積もる方法は?

着信データが高速で継続的に流れるNetworkStreamから読み取る必要があります。知りたかった

  • bufferSize値を設定するための基礎は何ですか?
  • 環境に関係なく選択できる標準の「安全な」値はありますか?
  • 読み込もうとしているストリーム(FileStream / NetworkStream / ..)によっても異なる必要がありますか?

見積もりの​​焦点としてパフォーマンスを考慮してください。

0 投票する
3 に答える
1329 参照

c# - .NET での TCP サーバーの送信が速すぎる

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

例:

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

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

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

0 投票する
1 に答える
628 参照

c# - NetworkStream プーリング

TCP 接続を介してサーバーと通信するマルチスレッド アプリケーションがあります。アプリケーションは Windows サービスとしてデプロイされます。

実装されている方法は、オブジェクトControllerを作成Communicatorし、ポート番号、メッセージ数などのプロパティをに割り当て、Communicatorそのメソッドを呼び出しStartClientてサーバーとのダイアログを開始することです。

メソッド内でStartClient、各Communicatorオブジェクトは、 で指定されたポート番号と URL を使用して、サーバーへの接続を作成しますController。接続を確立した後、内部でスレッドを作成しReadMessages、メッセージ数が満たされるまでサーバーから読み取り続けるメソッドを呼び出してから閉じます。

ランタイム条件に基づいて、Communicatorオブジェクトを再利用してサーバーと再度通信する必要がある場合があるため、ReadMessagesメソッドが再度呼び出されます。

最初はDispose()、メソッドの完了時に NetworkStream、StreamReader、および StreamWriter オブジェクトのメソッドを呼び出していましたが、再接続シナリオでは、「破棄されたオブジェクトにアクセスできません」というエラーReadMessagesがスローされていました。そのため、テストのためにメソッド呼び出しをコメントアウトしました。Dispose

今のところ問題なく動作していますが、オブジェクトを破棄していないため、これがこの機能を実現するための最良の方法ではないことを懸念しています。

オブジェクトのプーリングに関して考えていたのですが、別のスレッドで再利用できる Stream オブジェクトのプールを持つことが可能なら?

これに取り組む 1 つの方法は、 がサーバーに接続するたびに Stream オブジェクトの新しいインスタンスを作成することですCommunicatorが、それはコストのかかる操作になると思います。

Communicatorパフォーマンスに影響を与えずにオブジェクトを再利用できるように、この状況を処理するためのより良いアプローチを特定するのを手伝ってくれませんか?

0 投票する
2 に答える
152 参照

java - Can you send images without stalling the other data going through the same java.net.socket?

This is the situation:

I'm working on a project where I need to be able to send one or more images once in a while to/from the server as well as a lot of other types of data represented with text. The way it is currently done, is by sending a message with that says "incoming image of size x to be used as y" (It's not "formulated" that way of course), and then I call a method that reads the next x bytes through a DataInputStream. At first I met some problems with latency screwing things up, but I made the server spawn a new thread to send the "incoming image" message, and then wait for a flag that is set when the client responds with a "I'm ready for the image" message. It works in a way now, but if anything else, for instance a chat message, is sent while the image is being transfered, that message meant for a BufferedReader will be read as raw bytes and used as part of the image. So I will have to block all outgoing data (and add it to a queue) when there is an image that is being sent. But this seems very wrong and annoying, as users of the application will not be able to chat while receiving/ uploading a big image.

This is what I need: So, I either need to set up an independent channel to use for raw data. Which, as far as I understand from some tinkering, I will have to set up a new socket over a new port, which seems unnecessary. The other way I can see to solve this, would be to somehow use tag each packet with a "this is text/raw data" bit, but I have no idea how to do this with java? Can you add information to the packet-header when you write something to the stream (that every packet containing that info will contain) and then read the packet data on the other end and act accordingly?

As you can see, I do not have much experienced with networking, nor have I used Java for a long time. This is also my first post here, so be kind. If anything was unclear, please ask, and I'll specify. All ideas are welcome! (There is possibly a standard way to do this?)

Thanks a lot!

0 投票する
1 に答える
14582 参照

c# - サーバーからのメッセージの読み取り方法は?(tcp)

サーバーへのクライアントの書き込み-サーバーの読み取り。およびサーバーがクライアントに書き込みます-クライアントは読み取られません。

サーバ:

クライアント:

0 投票する
2 に答える
839 参照

c# - C# NetworkStream.Read にかかる時間を測定するには?

クライアントが c# を使用して tcp 経由でデータを受信するのにかかる時間を測定したいと考えています。

NetworkStream.Read を使用して、NetworkStream.Write を使用して送信された 100 メガビットのデータを読み取ります。バッファを同じサイズのデータ​​に設定したので、バッファアンダーランの問題などはありません。一般的にはこのようになります。

問題は、送信者が実際にデータを送信していなくても、ストップウォッチが既に実行されている可能性があることです。データの受信にかかった時間を正確に測定するにはどうすればよいですか? リモートPC stream.Writeのタイムラプスを使ってみたのですが、書き込みにかかった時間は極端に短いです。ところで、ストップウォッチはこの作業に最も正確なツールですか?

0 投票する
3 に答える
1693 参照

c# - 非同期ネットワークストリームからファイルストリーム(またはその逆)

クライアント/サーバーアプリがあります。どちらもデータを受信するときに非同期呼び出しを使用します。TCPを使用したビルドであり、主にファイルの送信を目的としています。

コマンドはソケットに沿って送信され、ソケットは単純なスイッチケースに「変換」されてアクションを実行します。クライアントがコマンド「SENDFILE」を送信した場合、サーバーが関数を呼び出すケースを入力できるようにします。この関数は、そのソケットに沿ってさらにデータを処理し、それをファイルに結合します。

これは、サーバー側のOnDataReceiveコールバック関数とスイッチケースです。

ここで、ネットワークストリームから非同期的に読み取り、ファイルストリームに同期的に書き込むクラス:そうですか?

私が抱えている問題は、ファイルストリームからネットワークストリームへの読み取りとは逆のことです。ファイルストリームから非同期で読み取り、ネットワークストリームに同期的に書き込む必要がありますか?

また、上記の例では、Start()が最初に呼び出されて関数が終了すると、サーバーのswitchケースに戻り、それ以降の(ファイル)データがPacket returnPacket = Helper.ByteArrayToPacket(socketData.dataBuffer);

とエラー:(

*編集1*

  • 外部ライブラリや大量のコードを使用することはできません。これはゼロから構築する必要があります。

  • これは典型的なクライアントサーバーアプリではなく、より多くのp2pですが、完全ではありません。各アプリには、異なるスレッドで実行される独自のサーバーとクライアントがあります。これにより、複数のアプリがすべて相互に接続して...ネットワークを作成できます。

  • クライアントはサーバーにファイルを送信していることを通知しますが、サーバーにファイルを要求しません