public void SendLoginMsg(ClientMsgModel msg, User user)
        {
            //IPAddress ip = IPAddress.Parse(user.client.Client.RemoteEndPoint.ToString());

            OnlineUser __onlineUser = new OnlineUser();

            __onlineUser.IP       = (user.client.Client.RemoteEndPoint as IPEndPoint).Address.ToString();
            __onlineUser.Port     = (user.client.Client.RemoteEndPoint as IPEndPoint).Port.ToString();
            __onlineUser.UserName = msg.UserName;
            if (!this.onlineUser.Contains(__onlineUser))
            {
                this.onlineUser.Add(__onlineUser);
            }

            SetListBox(string.Format("登录IP:{0},端口:{1}", msg.IP, msg.Port));

            ServerMsgModel __serMsgModel = new ServerMsgModel();

            __serMsgModel.SendIP       = msg.IP;
            __serMsgModel.SendPort     = msg.Port;
            __serMsgModel.SendUserName = msg.UserName;
            __serMsgModel.SendType     = msg.Type;
            __serMsgModel.OnlineUser   = this.onlineUser;
            string __sendSerMsg = JsonConvert.SerializeObject(__serMsgModel);

            for (int i = 0; i < this.userList.Count; i++)
            {
                SendToClient(userList[i], __sendSerMsg);
            }
        }
        private void ChatClient_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                if (this.client != null)
                {
                    //发送套接字、编辑的内容、用户名、发送时间。
                    ClientMsgModel msg = new ClientMsgModel()
                    {
                        IP       = this._user.p_serverIP,
                        Port     = this._user.p_serverPort,
                        Msg      = "SignOut",
                        NowDate  = DateTime.Now.ToString(),
                        Type     = "3",
                        UserName = this._user.p_userName
                    };
                    //string sendMsg = ConvertJson.ToJson(msg);
                    string sendMsg = JsonConvert.SerializeObject(msg);

                    isExit = true;
                    br.Close();
                    bw.Close();
                    this.client.Close();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 private void btnSend_Click(object sender, EventArgs e)
 {
     try
     {
         //Func<OnlineUser, bool> b =
         OnlineUser ol = this._onlineUser.Where(delegate(OnlineUser olUser)
         {
             return(olUser.UserName == this.lbx在线列表.SelectedItem.ToString());
         }).FirstOrDefault();
         //发送套接字、编辑的内容、用户名、发送时间。
         ClientMsgModel msg = new ClientMsgModel()
         {
             IP          = this._user.p_serverIP,
             Port        = this._user.p_serverPort,
             Msg         = this.txtSendMsg.Text,
             NowDate     = DateTime.Now.ToString(),
             Type        = "2",
             UserName    = this._user.p_userName,
             ReceiveIP   = ol.IP,
             ReceivePort = ol.Port,
         };
         //string sendMsg = ConvertJson.ToJson(msg);
         string sendMsg = JsonConvert.SerializeObject(msg);
         SendString(sendMsg);
         this.txtSendMsg.Clear();
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
        public ChatClient(User v_user)
        {
            InitializeComponent();
            this._user = v_user;
            //建立网络通信
            try
            {
                this.client = new TcpClient(this._user.p_serverIP, int.Parse(this._user.p_serverPort));//定义服务器端ip地址和端口,与服务器端定义要一致

                this.linkFlag = true;
            }
            catch
            {
                return;
            }
            this._addList           = new AddListBoxItemCallBack(this.AddListBoxItem);
            this._appendChatMsgText = new AppendChatMsgTextCallBack(this.AppendChatMsgText);
            if (this.linkFlag)
            {
                //获取网络流
                networkStream = client.GetStream();
                //将网络作为二进制读写对象,使用utf8编码
                br = new BinaryReader(networkStream);
                bw = new BinaryWriter(networkStream);

                //发送套接字、编辑的内容、用户名、发送时间。
                ClientMsgModel msg = new ClientMsgModel()
                {
                    IP       = this._user.p_serverIP,
                    Port     = this._user.p_serverPort,
                    Msg      = this.txtSendMsg.Text,
                    NowDate  = DateTime.Now.ToString(),
                    Type     = "1",
                    UserName = this._user.p_userName
                };
                //string sendMsg = ConvertJson.ToJson(msg);
                string sendMsg = JsonConvert.SerializeObject(msg);

                SendString(sendMsg);

                ThreadStart ts     = new ThreadStart(ReceiveData);
                Thread      thRece = new Thread(ts);
                thRece.Start();
            }
            this.Text = this.Text + " 当前登录名:" + this._user.p_userName;
        }
        /// <summary>
        /// 接收、处理客户端信息,每客户1个线程,参数用于区分是哪个客户
        /// </summary>
        /// <param name="obj"></param>
        public void ReceiveData(object obj)
        {
            User      user   = obj as User;
            TcpClient client = user.client;
            //是否正常退出接收线程
            bool normalExit = false;
            //用于控制是否退出循环
            bool exitWhile = false;

            while (exitWhile == false)
            {
                string receiveString = null;
                try
                {
                    //从网络流中读出字符串
                    //此方法会自动判断字符串长度前缀,并根据长度前缀读出字符串
                    receiveString = user.br.ReadString();
                }
                catch (Exception)
                {
                    //底层套接字不存在时会出现异常
                    SetListBox("接收数据失败");
                }

                if (receiveString == null)
                {
                    if (normalExit == false)
                    {
                        //如果停止了监听,Connected为false
                        if (client.Connected == true)
                        {
                            SetListBox(string.Format("与[{0}]失去联系,已终止接收该用户信息", client.Client.RemoteEndPoint));
                        }
                    }
                    break;
                }
                SetListBox(string.Format("来自[{0}]:{1}", user.client.Client.RemoteEndPoint, receiveString));
                ClientMsgModel msg = new ClientMsgModel();
                msg = (ClientMsgModel)JsonConvert.DeserializeObject(receiveString, typeof(ClientMsgModel));

                switch (msg.Type)
                {
                case "1":
                    this.SendLoginMsg(msg, user);
                    break;

                case "2":
                    User userReceive = this.userList.Where(delegate(User u)
                    {
                        return(u.client.Client.RemoteEndPoint.ToString() == msg.ReceiveIP + ":" + msg.ReceivePort);
                    }).FirstOrDefault();

                    ServerMsgModel __serMsgModel = new ServerMsgModel();
                    __serMsgModel.SendIP       = (user.client.Client.RemoteEndPoint as IPEndPoint).Address.ToString();
                    __serMsgModel.SendPort     = (user.client.Client.RemoteEndPoint as IPEndPoint).Port.ToString();
                    __serMsgModel.SendUserName = msg.UserName;
                    __serMsgModel.SendType     = msg.Type;
                    __serMsgModel.SendMsg      = msg.Msg;
                    string __sendSerMsg = JsonConvert.SerializeObject(__serMsgModel);

                    SendToClient(userReceive, __sendSerMsg);
                    break;

                default: break;
                }
            }
            userList.Remove(user);
            client.Close();
            SetListBox(string.Format("当前连接用户数:{0}", userList.Count));
        }