private void ButtonSend_Click(object sender, EventArgs e)
        {
            var toId = (string)lblModel.Tag;

            toId = (toId == "ALL") ? string.Empty : toId;
            imcp = new IMCommParamMessage()
            {
                msgType = msgType.Text, fromConnId = imModel.ConnId, toConnId = toId, message = TextBoxMessage.Text, isSuccess = true
            };
            HubProxy.Invoke("SendMessage", JsonConvert.SerializeObject(imcp));
            TextBoxMessage.Text = String.Empty;
            TextBoxMessage.Focus();
        }
        private void doMessage(string data)
        {
            dynamic imcpData;

            imcp = JsonConvert.DeserializeObject <IMCommParamBase>(data);
            switch (imcp.msgType)
            {
            case msgType.Text:
                imcpData = JsonConvert.DeserializeObject <IMCommParamMessage>(data);
                var immodel = Services.Union(Clients).First(f => f.ConnId == imcp.fromConnId);
                this.Invoke((Action)(() => {
                    RichTextBoxConsole.AppendText(String.Format("{0} - {1}:\n {2}" + Environment.NewLine, immodel.isService ? "Service" : "Client", immodel.Name, imcpData.message));
                }));
                break;

            case msgType.LineState:
                imcpData = JsonConvert.DeserializeObject <IMCommParamLineState>(data);
                if (imcp.isSuccess)
                {
                    if (imcpData.Count > 0)      //中断确定类型是否为List<T>
                    {
                        foreach (var d in (List <IMCommModel>)imcpData.IMModels)
                        {
                            if (d.isService)
                            {
                                if (!Services.Exists(e => e.ConnId == d.ConnId))
                                {
                                    Services.Add(d);
                                    treeViewFlush(treeView1, imcp.isSuccess, d);
                                }
                            }
                            else
                            {
                                if (!Clients.Exists(e => e.ConnId == d.ConnId))
                                {
                                    Clients.Add(d);
                                    treeViewFlush(treeView2, imcp.isSuccess, d);
                                }
                            }
                        }
                    }
                    else
                    {
                        var cm = (IMCommModel)imcpData.IMModel;
                        if (cm == null)
                        {
                            return;
                        }
                        if (cm.isService)
                        {
                            if (!Services.Exists(e => e.ConnId == cm.ConnId))
                            {
                                Services.Add(cm);
                                treeViewFlush(treeView1, imcp.isSuccess, cm);
                            }
                        }
                        else
                        {
                            if (!Clients.Exists(e => e.ConnId == cm.ConnId))
                            {
                                Clients.Add(cm);
                                treeViewFlush(treeView2, imcp.isSuccess, cm);
                            }
                        }
                    }
                }
                else
                {
                    var cm = (IMCommModel)imcpData.IMModel;
                    if (cm == null)
                    {
                        return;
                    }
                    if (cm.isService)
                    {
                        Services.Remove(Services.First(f => f.ConnId == imcp.fromConnId));
                        treeViewFlush(treeView1, imcp.isSuccess, cm);
                    }
                    else
                    {
                        Clients.Remove(Clients.First(f => f.ConnId == imcp.fromConnId));
                        treeViewFlush(treeView2, imcp.isSuccess, cm);
                    }
                }
                break;

            case msgType.Command:
                //反射
                break;
            }
        }