Пример #1
0
        /// <summary>Thread関数</summary>
        public void invoke()
        {
            // 通信シーケンスは自分で設計する
            // (本サンプルはリクエスト・レスポンス型の通信シーケンス)。

            NetworkStream ns = null;
            MemoryStream  ms = null;

            byte[] buff = new byte[256];
            byte[] byt  = null;

            int bytSize = 0;

            string msg = "";

            // スレッドID
            int managedThreadId = Thread.CurrentThread.ManagedThreadId;

            try
            {
                bool disConnect = false;
                ns = this.TCPCnn.GetStream();

                // 接続メッセージを表示
                this.SetResult_Svr(
                    string.Format(
                        "接続 - ThreadId:{0}", managedThreadId));

                do
                {
                    ms = new MemoryStream();

                    // 受信処理

                    while (true)
                    {
                        // メッセージ(の一部 - 256 byte)を受信
                        bytSize = ns.Read(buff, 0, buff.Length); //(待機)

                        // 受信したメッセージをメモリに蓄積
                        ms.Write(buff, 0, bytSize);

                        // 受信したメッセージを文字列に変換
                        msg = Encoding.UTF8.GetString(ms.ToArray());

                        // ここでは、シーケンス制御文字の
                        // <end-send>が送られるまで受信を続行する。
                        if (msg.IndexOf("<end-send>") != -1)
                        {
                            // シーケンス制御文字を消去
                            msg = msg.Replace("<end-send>", "");
                            break;
                        }

                        // ここでは、シーケンス制御文字の
                        // <end-connect>が送られるまで受信を続行する。
                        if (msg.IndexOf("<end-connect>") != -1)
                        {
                            // これがきたときに切断
                            disConnect = true;

                            // シーケンス制御文字を消去
                            msg = msg.Replace("<end-connect>", "");
                            break;
                        }
                    }

                    ms.Close();

                    // 受信メッセージを表示
                    this.SetResult_Svr(
                        string.Format("({0})受信:{1}", managedThreadId, msg));

                    // 反転処理
                    msg = CmnClass.strrev(msg);

                    // 送信処理

                    if (!disConnect) // <end-connect>の際は、接続がクライアントから切断されている。
                    {
                        // 送信処理
                        byt = Encoding.UTF8.GetBytes(msg + "<end-send>");
                        ns.Write(byt, 0, byt.Length);

                        // 送信メッセージを表示
                        this.SetResult_Svr(
                            string.Format("({0})送信:{1}", managedThreadId, msg));
                    }
                } while (!disConnect);
            }
            finally
            {
                // TCPコネクションをクローズ
                ms.Close();
                ns.Close();
                this.TCPCnn.Close();

                // 切断メッセージを表示
                this.SetResult_Svr(
                    string.Format(
                        "切断 - ThreadId:{0}", managedThreadId));
            }
        }
Пример #2
0
        /// <summary>サーバ起動 - listenerスレッド関数</summary>
        private void ListeningNamedPipe()
        {
            // 通信シーケンスは自分で設計する
            // (本サンプルはリクエスト・レスポンス型の通信シーケンス)。

            // 名前付きパイプ(サーバ)
            NamedPipeServerStream np = null;
            MemoryStream          ms = null;

            // スレッドID
            int managedThreadId = Thread.CurrentThread.ManagedThreadId;

            try
            {
                // 名前付きパイプ(サーバ)を生成
                // ※ 双方向のメッセージ ストリーム(最大5個オープン可能)
                np = new NamedPipeServerStream(
                    "mypipe", PipeDirection.InOut, 5);

                // Listening開始を表示
                this.SetResult_Svr(
                    string.Format("Listening開始! - ThreadId:{0}", managedThreadId));

                np.WaitForConnection(); //(待機)

                // 接続を表示
                this.SetResult_Svr(
                    string.Format("接続 - ThreadId:{0}", managedThreadId));

                // 終了させるまで延々と読み続ける。
                bool disConnect = false;

                byte[] buff = new byte[256];
                byte[] byt  = null;

                int bytSize = 0;

                string msg = "";

                do
                {
                    ms = new MemoryStream();

                    // 受信処理

                    while (true)
                    {
                        // 送信元(=クライアント)毎に読み込むことができる。
                        bytSize = np.Read(buff, 0, buff.Length);

                        // 受信したメッセージをメモリに蓄積
                        ms.Write(buff, 0, bytSize);

                        // 受信したメッセージを文字列に変換
                        msg = Encoding.UTF8.GetString(ms.ToArray());

                        // ここでは、シーケンス制御文字の
                        // <end-send>が送られるまで受信を続行する。
                        if (msg.IndexOf("<end-send>") != -1)
                        {
                            // シーケンス制御文字を消去
                            msg = msg.Replace("<end-send>", "");
                            break;
                        }

                        // ここでは、シーケンス制御文字の
                        // <end-connect>が送られるまで受信を続行する。
                        if (msg.IndexOf("<end-connect>") != -1)
                        {
                            // これがきたときに切断
                            disConnect = true;

                            // シーケンス制御文字を消去
                            msg = msg.Replace("<end-connect>", "");
                            break;
                        }
                    }

                    // 受信メッセージを表示
                    this.SetResult_Svr(
                        string.Format("({0})受信:{1}", managedThreadId, msg));

                    // 反転処理
                    msg = CmnClass.strrev(msg);

                    // 送信処理

                    if (!disConnect) // <end-connect>の際は、接続がクライアントから切断されている。
                    {
                        // 送信処理
                        byt = Encoding.UTF8.GetBytes(msg + "<end-send>");
                        np.Write(byt, 0, byt.Length);

                        // 送信メッセージを表示
                        this.SetResult_Svr(
                            string.Format("({0})送信:{1}", managedThreadId, msg));
                    }
                } while (!disConnect);
            }
            catch (Exception ex)
            {
                // エラーを表示
                this.SetResult_Svr(
                    string.Format("({0})エラー:{1}", managedThreadId, ex.ToString()));
            }
            finally
            {
                if (np != null)
                {
                    // 名前付きパイプ(サーバ)をクローズ
                    np.Close();
                }
            }

            // 切断を表示
            this.SetResult_Svr(
                string.Format("切断 - ThreadId:{0}", managedThreadId));
        }