/// <summary>
        /// コンストラクタ
        /// </summary>
        public ClientWindow()
        {
            InitializeComponent();

            // ログがリストボックスに表示されるようにする。
            this.DataContext = this.LogCollection;

            this.AddLog("***** クライアントアプリケーション開始 *****");

            //var lcAddr = new IPAddress(new byte[] { 192, 168, 150, 131 });
            var lcAddr = new IPAddress(new byte[] { 192, 168, 25, 100 });
            var lcPort = 65000;
            var lcEndPoint = new IPEndPoint(lcAddr, lcPort);
            //var rmAddr = new IPAddress(new byte[] { 192, 168, 150, 132 });
            var rmAddr = new IPAddress(new byte[] { 192, 168, 25, 85 });
            var rmPort = 65000;
            var rmEndPoint = new IPEndPoint(rmAddr, rmPort);
            try
            {
                this.tcpCommunicator = new TcpCommunicator(lcEndPoint, rmEndPoint);
                this.tcpCommunicator.DataReceived += TcpCommunicatorDataReceived;
                this.tcpCommunicator.ExceptionHappened += TcpCommunicatorExceptionHappened;
                var msg = "サーバに接続しました。(Local側IP:" + lcEndPoint.Address.ToString() + ", ポート:" + lcEndPoint.Port.ToString();
                msg += ", Remode側IP:" + rmEndPoint.Address.ToString() + ", ポート:" + rmEndPoint.Port.ToString() + ")";
                this.AddLog(msg);
            }
            catch (Exception ex)
            {
                var msg = "サーバとの接続に失敗しました。(" + ex.GetType().ToString() + ":" + ex.Message + ")";
                this.AddLog(msg, LogRecord.WarningLevel.Error, ex.StackTrace);
                return;
            }
            this.encoding = Encoding.UTF8;
        }
        /// <summary>
        /// 接続待受けスレッド
        /// </summary>
        /// <param name="iResult">非同期処理の結果を指定します。</param>
        private void AcceptCallback(IAsyncResult iResult)
        {
            var listener = this.tcpListener;
            TcpCommunicator communicator = null;
            try
            {
                lock (listener)
                {
                    // クライアントと接続
                    communicator = new TcpCommunicator(listener.EndAcceptTcpClient(iResult));
                }

                // クライアント接続を通知
                this.OnTcpCommunicatorConnected(new TcpCommunicatorConnectedEventArgs(communicator));
                if (communicator.IsConnected)
                {
                    // 接続が維持されている場合はリストに追加する。
                    communicator.Disposing += CommunicatorDisposing;
                    this.tcpCommunicatorList.Add(communicator);
                }
                else
                {
                    // 接続イベント内で切断された場合は破棄する。
                    communicator.Dispose();
                }
            }
            catch (Exception ex)
            {
                var msg = "接続待受け処理で例外が発生しました。(" + ex.GetType().ToString() + ":" + ex.Message + ")";
                var exception = new ApplicationException(msg, ex);
                this.OnExceptionHappened(new ExceptionHappenedEventArgs(exception));
            }
        }
 /// <summary>
 /// プログラム終了時の処理を行います。
 /// </summary>
 /// <param name="sender">イベントを送信したオブジェクトを指定します。</param>
 /// <param name="e">イベント引数を指定します。</param>
 private void WindowClosed(object sender, EventArgs e)
 {
     if (this.tcpCommunicator != null)
     {
         this.tcpCommunicator.DataReceived -= TcpCommunicatorDataReceived;
         this.tcpCommunicator.ExceptionHappened -= TcpCommunicatorExceptionHappened;
         this.tcpCommunicator.Dispose();
         this.tcpCommunicator = null;
     }
 }