Exemple #1
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);
            }
        }
Exemple #2
0
        /// <summary>
        /// 開始
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected override void ButtonF1_Click(object sender, EventArgs e)
        {
            Logger.StartMethod(MethodBase.GetCurrentMethod().Name);
            base.ButtonF1_Click(sender, e);
            // ▼▼▼ 業務処理 ▼▼▼

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

            // Listen
            string ip = tboxIP.Text;

            int.TryParse(tboxPort.Text, out int port);
            TcpServerUtil = new TcpServerManager(ip, port);

            listViewLog.Items.Add($"Listenを開始しました。IP[{ip}] Port[{port}]");

            // Task停止用のトークン発行
            CancelTokenSource = new CancellationTokenSource();
            CancellationToken cToken = CancelTokenSource.Token;

            // Accept Loop Start
            acceptLoopTask = AcceptLoop(cToken);

            // ボタンの有効無効を設定
            SetButtonEnabled(ActionMode.Listen);
            // ▲▲▲ 業務処理 ▲▲▲
            Logger.EndMethod(MethodBase.GetCurrentMethod().Name);
        }
Exemple #3
0
        private async void FormTcpServer_FormClosing(object sender, FormClosingEventArgs e)
        {
            CancelTokenSource?.Cancel();

            // Lisner Stop And TcpClient Close
            TcpServerUtil?.Dispose();

            // Accept And Read Task Wait
            List <Task> waitTasks = new List <Task>();

            if (acceptLoopTask != null)
            {
                waitTasks.Add(acceptLoopTask);
            }
            foreach (TcpServerManager.ClientInfo mgr in dicTcpClient.Values)
            {
                waitTasks.Add(mgr.ReadTask);
            }
            await Task.WhenAll(waitTasks);

            // Logger Dispose
            Logger?.Dispose();
        }
Exemple #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());
            // ▲▲▲ 業務処理 ▲▲▲
        }
Exemple #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));
        }
Exemple #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));
        }