2011-02-02 17 views
7

私は、TCPソケット上でアプリケーション間でバイナリデータをたくさん送信しましたが、文字列を使用する前には使用しませんでした。そうしようとしている問題につまずいた。ここに私が持っているものがあります:tcpネットワークストリーム上の読み書き可能な文字列

 TcpClient tcpClient = new TcpClient("localhost", port); 

     //Connects fine 
     NetworkStream ns = tcpClient.GetStream(); 
     StreamWriter sw = new StreamWriter(ns); 

     //The code moves on but nothing seems to be sent unless I do 
     //a sw.Close() after this line. That would however close the 
     //ns and prevent me from reading the response further down 
     sw.Write("hello"); 

     //I am using a stream reader with ReadToEnd() on the tcpListener 
     //which never receives the string from this piece of code 

     //Since the above never actually send I get stuck here 
     string response = new StreamReader(ns).ReadToEnd(); 

     sw.Close(); 
     tcpClient.Close(); 

ネットワークストリームを閉じずに文字列を送信するにはどうしたらいいですか? ns.Flush()は、私が本当に探しているものです。

+0

フラッシングについての言葉。 NetworkStreamのドキュメントから、ns.Flush()は何もせず、sw.Flush()は将来の使用のために予約されているので、この場合のフラッシュは何もしません。 –

+0

これは間違っています(間違いは、文書の間違いです)。 ns.Flush()は将来の使用のために予約されていますが、sw.Flush()では予約されていません。私がsw.Flush()をコメントアウトすると失敗します。 – BlueVoodoo

答えて

6

あなたはsw.Flush()ですが、それはうまくいくはずです。 WriteLine()もこれを実行している可能性があります。

しかし、もう一方の側がReadLine()を実行するときは、改行で終わることを確認する必要があります。 Write()の代わりにWriteLine()を試してください。

StreamReader/Writerを閉じるときに注意してください。ストリームリーダー/ライターを閉じるときには、ストリームも閉じます。

+0

sw.Write()の後にsw.Flush()を追加しようとしましたが、まだ何も送信していないようです。 – BlueVoodoo

+1

@bluevooあなたは何も送っていないと確信していますか(反応はありません)?反対側がReadLine()を実行すると、改行がありません。 Write()の代わりにWriteLine()を試してください。 –

+0

ああ、そうだった。ありがとう! – BlueVoodoo

0

StreamWriterのAutoFlushプロパティをtrueに設定するだけで済みます。

+2

これは、1回の書き込みごとにフラッシュします。パフォーマンスはそれほど良くありません。 –

1

StreamWriter.Flush()があります。あなたにメッセージを送信し終えたら、sw.Flush()を実行してください。しかし、バッファサイズはかなり大きいので(最大数KBに)、正しい方法は応答を待つ直前のFlush()です。こうすれば、.Write()への複数のコールを1つのパケットにまとめて、同時に送信することができます。

+0

sw.Write()の後にsw.Flush()を追加しようとしましたが、まだ何も送信していないようです。 – BlueVoodoo

関連する問題