//============ // 返信受信 // サーバーから来る返信電文を受信する(すなわち、サーバーへ要求 // していた処理結果を、本メソッドで取得します)。 // 第1引数: クライアントクラス(各スレッド間の情報伝達に使用) public void ReceiveReply(PipeClient client) { //------------ // サーバーから返信(処理結果)を受け取る。 //------------ // 非同期操作のステータスを表すオブジェクト。 IAsyncResult result; try { // 返信(受信電文)のヘッダーを取得する。 // かつ、その後の処理を行なうメソッドを指定。 result = client.pipeClient.BeginRead(client.HeaderBuffer, 0, client.HeaderBuffer.Length, null, null); } catch (InvalidOperationException) //disconnected/disposed { return; } //------------ // 非同期操作完了 //------------ // 非同期処理が完了するまで待つ。 result.AsyncWaitHandle.WaitOne(); int bytesRead; try { // 非同期読み取りを完了するまで待機する操作を終了します。 bytesRead = client.pipeClient.EndRead(result); } catch (System.IO.IOException) //closed { return; } // 以下の処理は、サーバーから来た返信を読み始めてから実行 // されます。正確には、返信電文のヘッダーを読み終えた直後 // に、以下の処理の実行が開始されます。 // (それまで待機中となり、実行が開始されない) //------------ // ヘッダーの復元 // --- ヘッダーは、既に読み込み済みなので、後はそれをInt32型に復元する。 //------------ // 取得したデーターをバイト型配列からint型に変換 Int32 len = BitConverter.ToInt32(client.HeaderBuffer, 0); //------------ // データー本体読み込み //------------ // データー本体用バイト型配列 // 後にデーター本体を、バイト型配列に格納する時に使う。 byte[] inBuffer = new byte[len]; try { // ストリームからデーター本体を読み込む。 client.pipeClient.Read(inBuffer, 0, len); } catch (System.ObjectDisposedException) // ストリームが破棄されている場合 { return; } // 取得したデーターをバイト型配列からstring型に変換 // (バイト型配列 ---> ユニコードstring 変換) string temp; // 取得文字を格納するオブジェクト StringBytesController.ChangeBinaryToUnicodeStr( inBuffer, "shift_jis", out temp); // パイプストリーム解法 client.pipeClient.Close(); client.pipeClient.Dispose(); client.pipeClient = null; // 電文受信時に起動させるメソッドを実行 OnReceiveCall(DateTime.Now, temp); }
//============ // 接続通知受信メソッド // サーバーへ接続すると、無事に接続されたことを知らせる通知用電文が、 // サーバーから送られて来る仕様にしてあります。その通知を本メソッド // で受信します。 // 第1引数: クライアントクラス(各スレッド間の情報伝達に使用) private void ReceiveConnectionNotice(PipeClient client) { // 非同期操作のステータスを表すオブジェクト。 IAsyncResult result; try { // 接続通知用受信電文のヘッダーを取得する。 // かつ、その後の処理を行なうメソッドを指定。 result = client.pipeClient.BeginRead(client.HeaderBuffer, 0, client.HeaderBuffer.Length, null, null); } catch (InvalidOperationException) //disconnected/disposed { return; } //------------ // 非同期操作完了 //------------ // 非同期処理が完了するまで待つ。 result.AsyncWaitHandle.WaitOne(); int bytesRead; try { // 非同期読み取りを完了するまで待機する操作を終了します。 bytesRead = client.pipeClient.EndRead(result); } catch (System.IO.IOException) //closed { return; } // 以下の処理は、サーバーから来た接続通知を読み始めてから実行 // されます。正確には、接続通知電文のヘッダーを読み終えた直後 // に、以下の処理の実行が開始されます。 // (それまで待機中となり、実行が開始されない) //------------ // ヘッダーの復元 // --- ヘッダーは、既に読み込み済みなので、後はそれをInt32型に復元する。 //------------ // 取得したデーターをバイト型配列からint型に変換 Int32 len = BitConverter.ToInt32(client.HeaderBuffer, 0); //------------ // データー本体読み込み //------------ // データー本体用バイト型配列 // 後にデーター本体を、バイト型配列に格納する時に使う。 byte[] inBuffer = new byte[len]; // ストリームからデーター本体を読み込む。 client.pipeClient.Read(inBuffer, 0, len); // 取得したデーターをバイト型配列からstring型に変換 // (バイト型配列 ---> ユニコードstring 変換) string temp; // 取得文字を格納するオブジェクト StringBytesController.ChangeBinaryToUnicodeStr( inBuffer, "shift_jis", out temp); // サーバーに接続されたか確認。 if (temp == "A connection succeeded.") { // ストリームに対して、文字データーを読み書きするオブジェクトを生成 AccessStream ss = new AccessStream(pipeClient); // コマンド(命令)をサーバーへ送信。 ss.WriteString(client.CommandMessage, "shift_jis"); // サーバープロセスから通達されたメッセージを取得する。 client.ReceiveReply(client); } }