public TcpConnectionView(IMisakaConnection connection) : this()
 {
     _misakaConnection = connection;
     _misakaConnection.ParentWindow = this;
     ReportService.ReportDataAdded += AppendReport;
     InitControl(connection);
 }
        /// <summary>
        /// 关闭侦听服务
        /// </summary>
        private void StopServer()
        {
            Dispatcher.Invoke(() =>
            {
                BtnStartListening.Content   = "正在结束侦听";
                BtnStartListening.IsEnabled = false;
            });

            if (_misakaConnection.Close())
            {
                Dispatcher.Invoke(() =>
                {
                    _misakaConnection = null;
                });
            }
            else
            {
                Dispatcher.Invoke(() =>
                {
                    AddReportData(ReportMessageType.Error, "关闭服务器失败");
                });
                return;
            }

            Dispatcher.Invoke(() =>
            {
                ChangeServerControlStatus(true);
                BtnStartListening.IsEnabled = true;
                BtnStartListening.Content   = "开始侦听";
            });
        }
 /// <summary>
 /// 初始化客户端模式
 /// </summary>
 /// <param name="connection"></param>
 private void InitClient(IMisakaConnection connection)
 {
     TxtLocalAddr.SelectedItem = connection.IpAddress;
     TxtLocalPort.Text         = $"{connection.Port}";
     Title                  = "Tcp客户端";
     ConnType.Content       = "Tcp客户端";
     ClientLayer.Visibility = Visibility.Visible;
 }
        /// <summary>
        /// 服务器连接断开
        /// </summary>
        /// <param name="conn"></param>
        private void ServerDisconnected(IMisakaConnection conn)
        {
            DispatcherAddReportData(ReportMessageType.Warning, "服务器连接已经断开!");
            Dispatcher.Invoke(() => ChangeServerControlStatus(true));

            if (_autoSendThread != null && _autoSendThread.IsAlive)
            {
                _autoSendThread.Abort();
            }
        }
        /// <summary>
        /// 连接改变时触发
        /// </summary>
        /// <param name="conn"></param>
        private void OnConnectionModefied(IMisakaConnection conn)
        {
            if (!_connectionWindows.ContainsValue(conn.ParentWindow))
            {
                return;
            }
            var connection = _connectionWindows.FirstOrDefault(obj => obj.Value == conn.ParentWindow);

            connection.Key.Content = Dispatcher.Invoke(() => connection.Value.GetConnectionName());
        }
        /// <summary>
        /// 客户端断开连接事件
        /// </summary>
        /// <param name="conn"></param>
        private void OnClientDisconnect(IMisakaConnection conn)
        {
            if (_tcpClients.ContainsKey(conn.ConnectionName))
            {
                _tcpClients.Remove(conn.ConnectionName);
            }

            ParentWindow.DispatcherAddReportData(ReportMessageType.Info, $"{ReportMessageEnum.ClientDisconnected}:{conn.IpAddress}:{conn.Port}");
            ((TcpConnectionView)ParentWindow).OnServerClientDisconnect();
        }
 /// <summary>
 /// 检查客户端连接对象
 /// </summary>
 private void CheckClientConnection()
 {
     if (_misakaConnection != null)
     {
         return;
     }
     _misakaConnection = new MisakaTcpClient(GetLocalIpAddress(), GetLocalPort())
     {
         ConnectionType = ConnectionItemType.TcpClient
     };
     InitConnection(_misakaConnection);
 }
        /// <summary>
        /// 添加链接
        /// </summary>
        /// <param name="connection"></param>
        /// <returns></returns>
        public static bool AddConnection(IMisakaConnection connection)
        {
            if (MisakaConnections.Contains(connection))
            {
                return(false);
            }

            MisakaConnections.Add(connection);
            ConnectionAdded(null, new MisakaConnectionEventArgs()
            {
                Connection = connection
            });
            return(true);
        }
        /// <summary>
        /// 客户端连接断开
        /// </summary>
        /// <param name="conn"></param>
        private void ClientDisconnected(IMisakaConnection conn)
        {
            _misakaConnection = null;
            DispatcherAddReportData(ReportMessageType.Warning, "客户端连接已经断开!");
            Dispatcher.Invoke(() =>
            {
                ChangeClientControlStatus(true);
                BtnConnect.Content = "连接服务器";
            });

            if (_autoSendThread != null && _autoSendThread.IsAlive)
            {
                _autoSendThread.Abort();
            }
        }
        /// <summary>
        /// 初始化控件
        /// </summary>
        /// <param name="connection"></param>
        private void InitControl(IMisakaConnection connection)
        {
            CmbConnectedClient.Items.Add(Appconfig.SelectAllConnection);
            CmbConnectedClient.SelectedIndex = 0;

            InitConnection(connection);

            switch (connection.ConnectionType)
            {
            case ConnectionItemType.TcpServer:
                InitServer(connection);
                break;

            case ConnectionItemType.TcpClient:
                InitClient(connection);
                break;
            }
        }
        /// <summary>
        /// 添加属性图项目
        /// </summary>
        /// <param name="treeViewItem"></param>
        /// <param name="connection"></param>
        private void AddTreeViewItem(TreeViewItem treeViewItem, IMisakaConnection connection)
        {
            var label = new Label {
                Content = connection.ConnectionName, Tag = "ConnectionItem"
            };

            treeViewItem.Items.Add(label);
            if (!treeViewItem.IsExpanded)
            {
                treeViewItem.ExpandSubtree();
            }
            label.MouseDoubleClick += ViewConnectionWindow;
            var view = new TcpConnectionView(connection);

            _connectionWindows.Add(label, connection.ParentWindow);
            view.ConnectionModefied += OnConnectionModefied;
            view.ShowAtPosition(Left + Width, Top);
        }
        /// <summary>
        /// 初始化连接对象
        /// </summary>
        /// <param name="connection"></param>
        private void InitConnection(IMisakaConnection connection)
        {
            connection.ParentWindow             = this;
            connection.ClientReceivedDataEvent += DispatcherOutPutSocketData;
            connection.DataSendEvent           += DispatcherUpdateSendData;

            var misakaServer = connection as MisakaTcpServer;

            if (misakaServer != null)
            {
                misakaServer.ClientAccept        += RefreshClients;
                connection.ClientDisconnectEvent += ServerDisconnected;
            }
            else
            {
                connection.ClientDisconnectEvent += ClientDisconnected;
            }
        }
        /// <summary>
        /// 关闭远程连接
        /// </summary>
        private void ClientDisconnect()
        {
            if (_misakaConnection.Close())
            {
                Dispatcher.Invoke(() =>
                {
                    BtnConnect.Content = "连接服务器";
                    _misakaConnection  = null;
                    ReportService.Info("断开服务器连接。");
                });
            }
            else
            {
                Dispatcher.Invoke(() => ReportService.Error("断开连接失败!"));
                return;
            }

            Dispatcher.Invoke(() => ChangeClientControlStatus(true));
        }
        /// <summary>
        /// 输出套接字接收到的字节
        /// </summary>
        /// <param name="conn"></param>
        private void OutPutSocketData(IMisakaConnection conn)
        {
            var socketBytes = conn.OutPutSocketBytes();

            if (ShowDate || ShowSource)
            {
                TxtReceiveViewer.AppendText("数据:");
            }
            if (ShowDate)
            {
                TxtReceiveViewer.AppendText($"[{DateTime.Now.ToString(DateDisplayFormat)}]");
            }
            if (ShowSource)
            {
                TxtReceiveViewer.AppendText($"[{conn.TargetConnectionName}]");
            }
            if (ShowDate || ShowSource)
            {
                TxtReceiveViewer.AppendText("=>");
                TxtReceiveViewer.AppendText("\r");
            }
            TxtReceiveViewer.AppendText($"{Globals.ByteArrayToString(socketBytes, HexReceive)}");
            TxtReceiveViewer.AppendText("\r\n");

            if (AddBlankToReceive)
            {
                TxtReceiveViewer.AppendText("\r\n");
            }

            _totalReceive += _lastReceive = socketBytes.Length;

            TxtReceiveViewer.ScrollToEnd();

            if (Globals.ByteArrayToString(socketBytes, false) == "System Reset\r\n" && AutoReply)
            {
                SendTimeCheck();
            }

            UpdateStatusBar();
        }
        /// <summary>
        /// 添加新连接
        /// </summary>
        /// <param name="connection"></param>
        private void AddNewConnection(IMisakaConnection connection)
        {
            TreeViewItem item = null;

            switch (connection.ConnectionType)
            {
            case ConnectionItemType.TcpServer:
                item = TcpServerTreeItem;
                break;

            case ConnectionItemType.TcpClient:
                item = TcpClientTreeItem;
                break;
            }

            if (item == null)
            {
                return;
            }

            AddTreeViewItem(item, connection);
        }
        /// <summary>
        /// 创建新的连接
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static void NewMisakaConnection(string type)
        {
            IMisakaConnection conn = null;

            switch (type)
            {
            case ConnectionItemType.TcpServer:
                conn = new MisakaTcpServer(Globals.GetLocalIpAddress(), Globals.RandomPort())
                {
                    ConnectionType = type
                };
                break;

            case ConnectionItemType.TcpClient:
                conn = new MisakaTcpClient(Globals.GetLocalIpAddress(), Globals.RandomPort())
                {
                    ConnectionType = type
                };
                break;
            }

            AddConnection(conn);
        }
 /// <summary>
 /// 客户端接收数据事件
 /// </summary>
 /// <param name="conn"></param>
 private void OnClientReceivedData(IMisakaConnection conn)
 {
     OnReceivedData(conn);
 }
 /// <summary>
 /// 触发数据接收事件
 /// </summary>
 private void OnReceivedData(IMisakaConnection conn)
 {
     ClientReceivedDataEvent?.Invoke(conn);
 }
 /// <summary>
 /// 当连接信息更改时触发
 /// </summary>
 /// <param name="conn"></param>
 private void OnConnectionModefied(IMisakaConnection conn)
 {
     ConnectionModefied?.Invoke(conn);
 }
 /// <summary>
 /// 输出套接字接收到的字节
 /// </summary>
 private void DispatcherOutPutSocketData(IMisakaConnection conn)
 {
     Dispatcher.Invoke(DispatcherPriority.Normal, new ReceivedDataDispatcherDelegate(OutPutSocketData), conn);
 }