Example #1
0
        /// <summary>
        /// Send
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected override void ButtonF5_Click(object sender, EventArgs e)
        {
            Logger.WriteLine(MethodBase.GetCurrentMethod().Name);
            base.ButtonF5_Click(sender, e);

            // ▼▼▼ 業務処理 ▼▼▼
            // メッセージ送信
            string            sendMsg  = tboxMessage.Text;
            string            toName   = cboxTarget.Text;
            string            fromName = tboxName.Text;
            TcpMessageUtility mgr;

            if (toName.Equals("全員"))
            {
                mgr = new TcpMessageUtility(TcpMessageUtility.HeaderAllMsg, fromName, TcpMessageUtility.TargetAll, sendMsg);
            }
            else
            {
                mgr = new TcpMessageUtility(TcpMessageUtility.HeaderTargetMsg, fromName, toName, sendMsg);
            }

            if (!TcpClientUtil.Send(mgr.GetSendMessage()))
            {
                listViewLog.Items.Add("送信に失敗しました。再接続して下さい。");
                CloseAndInit();
            }

            // ▲▲▲ 業務処理 ▲▲▲
        }
Example #2
0
        /// <summary>
        /// Send
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected override void ButtonF5_Click(object sender, EventArgs e)
        {
            base.ButtonF5_Click(sender, e);
            try
            {
                // ▼▼▼ 業務処理 ▼▼▼

                string sendMsg  = tboxMessage.Text;
                string fromName = tboxName.Text;
                string toName   = cboxTarget.Text;

                TcpMessageUtility sendMsgMgr;
                if (toName.Equals("全員"))
                {
                    sendMsgMgr = new TcpMessageUtility(TcpMessageUtility.HeaderAllMsg, fromName, TcpMessageUtility.TargetAll, sendMsg);
                }
                else
                {
                    sendMsgMgr = new TcpMessageUtility(TcpMessageUtility.HeaderTargetMsg, fromName, toName, sendMsg);
                }

                TcpServerUtil.SendAll(sendMsgMgr.GetSendMessage());

                // 画面上にログを追加
                listViewLog.Items.Add(sendMsgMgr.GetRecvTargetMessage());
                // ▲▲▲ 業務処理 ▲▲▲
            }
            catch (Exception ex)
            {
                Logger.WriteException(MethodBase.GetCurrentMethod().Name, ex);
            }
        }
Example #3
0
        /// <summary>
        /// Connect
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected override void ButtonF1_Click(object sender, EventArgs e)
        {
            Logger.WriteLine(MethodBase.GetCurrentMethod().Name);

            base.ButtonF1_Click(sender, e);
            // ▼▼▼ 業務処理 ▼▼▼

            if (TcpClientUtil != null)
            {
                // 既に接続している場合、再接続前に破棄する
                TcpClientUtil.Dispose();
            }

            // 接続
            string ip = tboxIP.Text;

            int.TryParse(tboxPort.Text, out int port);

            try
            {
                TcpClientUtil = new TcpClientManager(ip, port);

                listViewLog.Items.Add($"接続しました。{TcpClientUtil.GetClientIpAndPort()}->{TcpClientUtil.GetServerIpAndPort()}");

                // 名前を送信
                string            name = tboxName.Text;
                TcpMessageUtility mgr  = new TcpMessageUtility(TcpMessageUtility.HeaderConnect, name, TcpMessageUtility.TargetAll, name);
                TcpClientUtil.Send(mgr.GetSendMessage());
            }
            catch (SocketException ex)
            {
                Debug.WriteLine(ex.ToString());
                listViewLog.Items.Add(ex.Message);
                return;
            }

            // 読み込みループ開始
            // Task停止用のトークン発行
            ReadCancelTokenSource = new CancellationTokenSource();
            CancellationToken cToken = ReadCancelTokenSource.Token;

            readLoopTask = ReadLoop(cToken);
            readLoopTask.ConfigureAwait(false);

            // ボタンの有効無効を設定
            SetControlEnabled(ActionMode.Connect);
            // ▲▲▲ 業務処理 ▲▲▲
        }
Example #4
0
        /// <summary>
        /// Send
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected override void ButtonF5_Click(object sender, EventArgs e)
        {
            base.ButtonF5_Click(sender, e);
            // ▼▼▼ 業務処理 ▼▼▼

            string sendMsg  = tboxMessage.Text;
            string fromName = tboxName.Text;
            string toName   = cboxTarget.Text;

            TcpMessageUtility sendMsgMgr;

            if (toName.Equals("全員"))
            {
                sendMsgMgr = new TcpMessageUtility(TcpMessageUtility.HeaderAllMsg, fromName, TcpMessageUtility.TargetAll, sendMsg);
            }
            else
            {
                sendMsgMgr = new TcpMessageUtility(TcpMessageUtility.HeaderTargetMsg, fromName, toName, sendMsg);
            }

            TcpServerUtil.SendAll(sendMsgMgr.GetSendMessage());
            // ▲▲▲ 業務処理 ▲▲▲
        }
Example #5
0
        private async Task AcceptLoop(CancellationToken cToken)
        {
            Logger.StartMethod(nameof(AcceptLoop));
            try
            {
                while (!cToken.IsCancellationRequested)
                {
                    // Acceptを非同期待機
                    TcpServerManager.ClientInfo mgr = await TcpServerUtil.AcceptAsync().ConfigureAwait(false);

                    // Accept完了後、後続処理が動く

                    string acceptClientName = mgr.GetClientIpAndPort();

                    Invoke((Action)(() =>
                    {
                        listViewLog.Items.Add($"[{MethodBase.GetCurrentMethod().Name}]{acceptClientName}が接続しました。");
                    }));

                    // Read Loop Start
                    mgr.ReadTask = ReadLoop(mgr, cToken);

                    // 接続してきたクライアントに対し、既に接続している他のクライアントの情報を送信
                    foreach (string clientName in dicTcpClient.Keys)
                    {
                        TcpMessageUtility sendMsgMgr = new TcpMessageUtility(TcpMessageUtility.HeaderName, clientName, acceptClientName, clientName);
                        TcpServerUtil.SendTarget(mgr.GetClientIpAndPort(), sendMsgMgr.GetSendMessage());
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.ToString());
                Logger.WriteException(nameof(AcceptLoop), ex);
            }
            Logger.EndMethod(nameof(AcceptLoop));
        }
Example #6
0
        private async Task ReadLoop(TcpServerManager.ClientInfo tcpClientMgr, CancellationToken cToken)
        {
            Logger.StartMethod(nameof(ReadLoop));

            try
            {
                TcpClient client = tcpClientMgr.Client;
                while (!cToken.IsCancellationRequested)
                {
                    // メッセージ受信
                    string texts = await TcpServerUtil.ReadAsync(client, cToken).ConfigureAwait(false);

                    if (texts != null)
                    {
                        // \nで分割
                        foreach (string text in texts.Split('\n'))
                        {
                            Logger.WriteLine(text);

                            Invoke((Action)(() =>
                            {
                                listViewLog.Items.Add($"[Read]{text}");
                            }));

                            TcpMessageUtility recvMsgMgr = new TcpMessageUtility(text);
                            TcpMessageUtility sendMsgMgr;
                            switch (recvMsgMgr.Header)
                            {
                            case TcpMessageUtility.HeaderConnect:
                                // 名前設定
                                // 辞書のキーの変更
                                dicTcpClient.Remove(tcpClientMgr.GetClientIpAndPort());

                                if (!dicTcpClient.ContainsKey(recvMsgMgr.Value))
                                {
                                    // 受信した名前が未登録の場合
                                    tcpClientMgr.Name = recvMsgMgr.Value;
                                    dicTcpClient.Add(tcpClientMgr.Name, tcpClientMgr);
                                }
                                else
                                {
                                    // 受信した名前が既に登録されている場合
                                    int    count = 0;
                                    string newName;
                                    do
                                    {
                                        // 番号を付加する
                                        count++;
                                        newName = recvMsgMgr.Value + count.ToString();
                                    } while (dicTcpClient.ContainsKey(newName));
                                    tcpClientMgr.Name = newName;
                                    dicTcpClient.Add(newName, tcpClientMgr);
                                }

                                // List&Comboに追加
                                Invoke((Action)(() =>
                                {
                                    listBoxUser.Items.Add(tcpClientMgr.Name);
                                    cboxTarget.Items.Add(tcpClientMgr.Name);
                                }));

                                // 全体に接続情報を送信
                                // Connect,IP:Port,受信した名前,登録した名前
                                sendMsgMgr = new TcpMessageUtility(TcpMessageUtility.HeaderConnect, tcpClientMgr.GetClientIpAndPort(), recvMsgMgr.Value, tcpClientMgr.Name);
                                TcpServerUtil.SendAll(sendMsgMgr.GetSendMessage());
                                break;

                            case TcpMessageUtility.HeaderTargetMsg:
                                // 送信元を設定
                                sendMsgMgr = new TcpMessageUtility(TcpMessageUtility.HeaderTargetMsg, tcpClientMgr.Name, recvMsgMgr.SendToTarget, recvMsgMgr.Value);

                                Invoke((Action)(() =>
                                {
                                    listViewLog.Items.Add(sendMsgMgr.GetRecvTargetMessage());
                                }));

                                // 受信したメッセージを対象に送信する
                                // 名前→IP:Portへの変換
                                string toTarget = dicTcpClient[recvMsgMgr.SendToTarget].GetClientIpAndPort();
                                TcpServerUtil.SendTarget(toTarget, sendMsgMgr.GetSendMessage());

                                // 受信したメッセージを送信元に送信する
                                // 名前→IP:Portへの変換
                                string fromTarget = tcpClientMgr.GetClientIpAndPort();
                                TcpServerUtil.SendTarget(fromTarget, sendMsgMgr.GetSendMessage());
                                break;

                            case TcpMessageUtility.HeaderAllMsg:
                            default:
                                // 送信元を設定
                                sendMsgMgr = new TcpMessageUtility(TcpMessageUtility.HeaderAllMsg, tcpClientMgr.Name, recvMsgMgr.SendToTarget, recvMsgMgr.Value);

                                Invoke((Action)(() =>
                                {
                                    listViewLog.Items.Add(sendMsgMgr.GetRecvTargetMessage());
                                }));

                                // 受信したメッセージを全体に送信する
                                TcpServerUtil.SendAll(sendMsgMgr.GetSendMessage());
                                break;
                            }
                        }
                    }
                    else
                    {
                        // 切断
                        Logger.WriteLine(nameof(ReadLoop), "切断されました。");
                        string deleteTargetIpAndPort = tcpClientMgr.GetClientIpAndPort();
                        _ = dicTcpClient.Remove(deleteTargetIpAndPort);
                        TcpServerUtil.Delete(deleteTargetIpAndPort);
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.ToString());
                Logger.WriteException(nameof(ReadLoop), ex);
            }

            Logger.EndMethod(nameof(ReadLoop));
        }
Example #7
0
        private async Task ReadLoop(CancellationToken cToken)
        {
            Logger.WriteLine(MethodBase.GetCurrentMethod().Name);

            try
            {
                while (!cToken.IsCancellationRequested)
                {
                    string texts = await TcpClientUtil.ReadAsync(cToken).ConfigureAwait(false);

                    if (texts != null)
                    {
                        foreach (string text in texts.Split('\n'))
                        {
                            Logger.WriteLine(text);

                            TcpMessageUtility mgr = new TcpMessageUtility(text);
                            switch (mgr.Header)
                            {
                            case TcpMessageUtility.HeaderConnect:
                                // 申請した名前が登録できたか判定する
                                // Connect,IP:Port,送信した名前,登録した名前
                                if (TcpClientUtil.GetClientIpAndPort().Equals(mgr.SendFromTarget))
                                {
                                    // 自分が送信したNAMEの返信
                                    if (!mgr.SendToTarget.Equals(mgr.Value))
                                    {
                                        // 別名に変更された場合、名前を変更する
                                        Invoke((Action)(() =>
                                        {
                                            tboxName.Text = mgr.Value;
                                            listViewLog.Items.Add($"既に名前が使われていたため、名前を{mgr.Value}に変更しました。");
                                        }));
                                    }
                                }
                                else
                                {
                                    // 他の人が送信したNAMEの受信
                                    Invoke((Action)(() =>
                                    {
                                        listViewLog.Items.Add($"{mgr.Value}が接続しました。");
                                    }));
                                }

                                // リストに追加する
                                Invoke((Action)(() =>
                                {
                                    listBoxUser.Items.Add(mgr.Value);
                                    cboxTarget.Items.Add(mgr.Value);
                                }));
                                break;

                            case TcpMessageUtility.HeaderName:
                                // リストに追加する
                                Invoke((Action)(() =>
                                {
                                    listBoxUser.Items.Add(mgr.Value);
                                    cboxTarget.Items.Add(mgr.Value);
                                }));
                                break;

                            case TcpMessageUtility.HeaderTargetMsg:
                                Invoke((Action)(() =>
                                {
                                    listViewLog.Items.Add(mgr.GetRecvTargetMessage());
                                }));
                                break;

                            case TcpMessageUtility.HeaderAllMsg:
                            default:
                                Invoke((Action)(() =>
                                {
                                    listViewLog.Items.Add(mgr.GetRecvMessage());
                                }));
                                break;
                            }
                        }
                    }
                    else
                    {
                        Logger.WriteLine("切断されました。");
                        Invoke((Action)(() =>
                        {
                            listViewLog.Items.Add("切断されました。");
                        }));
                        break;
                    }
                }
            }
            catch (ObjectDisposedException ex) // EOF.
            {
                Debug.WriteLine(ex.ToString());
                Invoke((Action)(() =>
                {
                    listViewLog.Items.Add("切断されました。");
                }));
            }
            //catch (Exception ex)
            //{
            //    Debug.WriteLine(ex.ToString());
            //    try
            //    {
            //        Invoke((Action)(() =>
            //        {
            //            listViewLog.Items.Add(ex.Message);
            //        }));
            //    }
            //    catch (Exception ex2)
            //    {
            //        Debug.WriteLine(ex.Message);
            //        Debug.WriteLine(ex2.Message);
            //    }
            //}
        }