3

私は次のコードを持っています:

_clientRequestStream = _tcpClient.GetStream();

var memoryStream = new MemoryStream();
_clientRequestStream.CopyTo(memoryStream);

CopyToStreamaを別の にコピーするには長い時間がかかりますStream。何の理由もなくそこでアプリケーションが停止するか、少なくとも理由を見つけることができなかったようです。

4

3 に答える 3

13

ネットワーク ストリームは、ストリームの一方の端によって閉じられるまで開いたままになります。CopyTo() は、ストリームが終了するまで待って、ストリームからすべてのデータをコピーします。サーバーがデータを送信していない場合、ストリームは終了または終了せず、CopyTo() は次のデータまたはストリームが終了するのを忠実に待ちます。ストリームの反対側のサーバーは、ストリームを終了して CopyTo() を返すためにストリームを閉じる必要があります。

Google の「TcpClient チュートリアル」または「TcpCLient サンプル」を参照して、NetworkStream.DataAvailable をチェックして待機中のデータがあるかどうか、またはストリームがまだデータなしで開いているかどうかを確認するなど、他の使用方法を示す優れたページを取得してください。ストリームが閉じるのを待たずにデータを読み取るだけにするには、NetworkStream.Read() を使用するか、StreamReader でラップして ReadLine() を使用します。それはすべて、接続しているサーバーと何を達成しようとしているかによって異なります。

于 2012-07-31T21:49:57.470 に答える
6

TCPはストリームプロトコルです。バイトは任意の速度で流れることができます。理論的には、1バイト、数秒後に10バイト、数分後に2バイトを取得できます。

TCPは、それ自体がプロトコルとしては役に立ちません。

「メッセージ」の最初と最後の両方を検出できる構造の高次プロトコルが必要です。聞いている高次プロトコルを推測することはできません。聞くには、それを知っている必要があります。

于 2012-07-31T22:09:34.793 に答える
2

これは、基礎となる接続が閉じられるまで無期限にブロックされます。閉じられた場合、IOExceptionがスローされると思います。NetworkStreamを通常のストリームのように考えることに注意してください。TCPClient.GetStream()は、Socketを直接使用する手間を省く優れた抽象化ですが、NetworkStreamとの同期操作を使用すると、このようなトラップに陥りやすくなります。NetworkStreamの特定のMSDNドキュメントを確認する価値があります。

TCPクライアントではなく非同期ソケットを使用する良い例を次に示します。http://www.codeproject.com/Articles/83102/C-SocketAsyncEventArgs-High-Performance-Socket-Cod

于 2012-07-31T22:11:44.063 に答える