Пример #1
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));
        }
Пример #2
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);
            //    }
            //}
        }