2011-01-17 17 views
0

私はクライアントサーバーユーティリティアプリケーションを作成しています。彼らはTcpClient/Stream(クライアント)とTcpListener/Socket(サーバー)を通じて通信します。私はこれらの2つの間でバイトを前後に送ります、そして、私は問題があるところに来ます。クライアントはサーバーに信号を送信します(たとえばStartCounting)。クライアントはいくつかのことをやり始めます(ゼロからカウントアップ)。サーバは、StartCountingを受信するとすぐに同じことを行います。さて、両側がカウントしている間、それぞれの側がカウントを中断するかもしれません(例えば、returnを押すことによって)。一方の側が停止すると、相手側にメッセージを送信して停止します。いくつか試行されたコードがあります(クライアントの場合、唯一の違いはバイト配列の読み方です)。C#ネットワークプログラミング - リスニング

private void WaitForBye(object source, ElapsedEventArgs e) 
{ 
    byte[] responseBytes = new byte[1000]; 
    int k = stream.Read(responseBytes, 0, 1000); 
    String response = ASCIIEncoding.ASCII.GetString(responseBytes); 
    response = response.Substring(0, k); 

    String from, to, message; 

    extractData(response, out message, out from, out to); 

    Console.WriteLine(++counter); 
    if (message == "BYE") 
     isBye = true; 
} 

bTimer = new Timer(); 
bTimer.Elapsed += new ElapsedEventHandler(WaitForBye); 
bTimer.Interval = 1000; 
bTimer.Enabled = true; 

Console.WriteLine("Press return when finished."); 
while (Console.ReadLine() != "" && !isBye) ; 

どうすればよいですか?好ましくはスレッドを使用せずに、代わりにTimerを使用します。

答えて

0

同じスレッドで同時にカウントしたりリスニングすることはできないと思うので、このスレッドのスレッドを調べる必要があります。 C#4.0では、このような作業がTasksによって非常に簡単になりました。

少し話題ですが、なぜあなたはソケットを使用していますか? WCFはここでうまく動作しませんか?それはあなたにタイピングのトラックを節約します。

幸運、

GJ

+1

@offtopic:これは私の最初のネットワーキングプログラムであり、私は自分のやり方を最低レベルから上げたいと思っています。 –

+0

さて、このルート(ボトムアップ)に行くと、多くの低レベルのスキルと理解力が提供されますが、それは確かです。あなたがそれを理解したいのであれば恐ろしいことではありません。 WCFを使用すると、プロダクションをすばやく素早く開始でき、初心者の落とし穴から守ることができます。それは本当のオーバーヘッドを追加します。しかし、MassTransitやProtocol Buffersのような他のコミュニケーション・フレームワークもあります。 – gjvdkamp

0

あなたが読むべきデータがあるかどうかを確認するためにstream.peekでそれを行うことができます。 それ以外の場合は、コードがデータがなくなるまで待機し、カウントが機能しません。 あなたが読むメッセージは完全ではない可能性があるので、このアプローチをミッションクリティカルな状況に使用しないでください。

WCFを使用すると、入力が節約されますが、通信のペイロードに追加されます。

サクセス。

+0

'Stream'は' Peek() 'メソッドをサポートしていません。そして、「ソケット」はどうですか? –