Пример #1
0
        private void joinButton_Click(object sender, RoutedEventArgs e)
        {
            var clientName = nameTextBox.Text;

            if (string.IsNullOrEmpty(clientName))
            {
                MessageBox.Show("请输入用户名");
                return;
            }

            try
            {
                _tcpClient = new TcpClient(_serverHostName, _serverPort);
                EnableJoinButton(false);
                _bw = new BinaryWriter(_tcpClient.GetStream());
                _br = new BinaryReader(_tcpClient.GetStream());

                var sendMsg = TcpHelper.PackCommmond(clientName, TcpHelper.TalkCommond.Login);
                //发送登录命令
                SendMessage(sendMsg);
            }
            catch (Exception ep)
            {
                EnableJoinButton(true);
                ShowMessage("连接服务器失败:" + ep.Message);
            }
        }
Пример #2
0
        private void WindowLoaded(object sender, RoutedEventArgs e)
        {
            userNameLabel.Content = _userName;
            _clientInstance       = TcpHandler.GetInstance();

            //获取当前登录用户的图标
            var imagePath = "pack://application:,,,/images/" + _userName + ".jpg";
            var iamgeUri  = new Uri(imagePath);

            try
            {
                loginUserImage.Source = new BitmapImage(iamgeUri);
            }
            catch
            {
                imagePath             = "pack://application:,,,/images/user.jpg";
                iamgeUri              = new Uri(imagePath);
                loginUserImage.Source = new BitmapImage(iamgeUri);
            }
            //获取好友列表
            var commond = TcpHelper.PackCommmond(_userName, TcpHelper.TalkCommond.UpdateUserList);

            _clientInstance.SendMessage(commond);

            //新建线程接收服务端数据
            th1 = new Thread(ReceiveData);
            th1.Start();

            //新建线程,用于更新消息提示
            th2 = new Thread(ScanEmptyMsgTip);
            th2.Start();
        }
Пример #3
0
 private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
 {
     if (_tcpClient != null)
     {
         var sendMsg = TcpHelper.PackCommmond(string.Empty, TcpHelper.TalkCommond.Logout);
         SendMessage(sendMsg);
         _br.Close();
         _bw.Close();
         _tcpClient.Close();
     }
 }
Пример #4
0
 private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
 {
     th1.Abort();
     th2.Abort();
     if (_clientInstance != null && _clientInstance.client.Connected)
     {
         var sendMsg = TcpHelper.PackCommmond(string.Empty, TcpHelper.TalkCommond.Logout);
         _clientInstance.SendMessage(sendMsg);
         _clientInstance.br.Close();
         _clientInstance.bw.Close();
         _clientInstance.client.Close();
     }
 }
Пример #5
0
        private void SendMessage()
        {
            var msg = sendMsgTextBox.Text;

            if (string.IsNullOrEmpty(msg))
            {
                MessageBox.Show("不能发送空内容");
                return;
            }

            var talkMsg = TcpHelper.PackCommmond(_talktoUserName + "," + msg, TcpHelper.TalkCommond.Talk);

            _clientInstance.SendMessage(talkMsg);
            ShowMessage(_loginUserName, msg, true);
            ScrollMessageToBottom();
            sendMsgTextBox.Text = string.Empty;
        }
Пример #6
0
        /// <summary>
        /// 登录连接到服务器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void loginButton_Click(object sender, RoutedEventArgs e)
        {
            //获取服务器IP
            var serverIP = serverIPTextBox.Text;

            if (string.IsNullOrEmpty(serverIP))
            {
                MessageBox.Show("请填写正确的服务器地址");
                return;
            }
            try
            {
                var serverIPs = serverIP.Split(':');
                TcpHandler._serverHostName = serverIPs[0]; ToString();
                TcpHandler._serverPort     = System.Convert.ToInt32(serverIPs[1]);
            }catch (Exception ex) {
                MessageBox.Show("服务器地址格式不正确");
                return;
            }

            var userName = userNameTextBox.Text;

            if (string.IsNullOrEmpty(userName))
            {
                MessageBox.Show("请输入用户名");
                return;
            }


            try
            {
                clientInstance = TcpHandler.GetInstance();
                var sendMsg = TcpHelper.PackCommmond(userName, TcpHelper.TalkCommond.Login);
                //发送登录命令
                clientInstance.SendMessage(sendMsg);

                //创建新线程接收服务端消息
                Thread th = new Thread(ReceiveData);
                th.Start();
            }catch (Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }
Пример #7
0
        private void ClientHandler(object client)
        {
            var currentClient = (TcpClient)client;
            var currentUser   = new User(currentClient);

            _loginUserList.Add(currentUser);

            while (true)
            {
                string getMsg = string.Empty;
                try
                {
                    getMsg = currentUser._binaryReader.ReadString();
                }catch (Exception e)
                {
                    AddMessage("客户端" + currentUser.UserName + "连接异常,已终止该用户连接。" + e.Message);
                    //连接异常时退出登录
                    RemoveUser(currentUser);
                    break;
                }

                var unPackMsg = TcpHelper.UnPackCommond(getMsg);


                var commond = unPackMsg.Item1;
                switch (commond)
                {
                case TcpHelper.TalkCommond.Login:
                    //用户登录
                    var userName = unPackMsg.Item2;
                    var login    = Login(currentUser, userName);

                    var sendMsg = TcpHelper.PackCommmond(login.Item2, TcpHelper.TalkCommond.Login);
                    SendMessageToClient(currentUser, sendMsg);
                    var isLogin = login.Item1;
                    if (isLogin)
                    {
                        //登录成功
                        //用户登录
                        AddMessage("用户" + userName + "已登录");
                        SetTotalUserCount(_loginUserList.Count());
                        currentUser.UserName = userName;
                    }
                    else
                    {
                        RemoveUser(currentUser);
                        //断开连接
                        currentUser.Close();
                        return;
                    }

                    break;

                case TcpHelper.TalkCommond.Logout:
                    sendMsg = TcpHelper.PackCommmond(string.Empty, TcpHelper.TalkCommond.Logout);
                    SendMessageToAllClient(sendMsg);
                    RemoveUser(currentUser);
                    return;

                case TcpHelper.TalkCommond.Talk:
                    userName = currentUser.UserName;
                    var talkMsg        = unPackMsg.Item2.Split(',');
                    var talktoUserName = talkMsg[0];
                    var talkContent    = unPackMsg.Item2.Substring(talkMsg[0].Length + 1, unPackMsg.Item2.Length - talkMsg[0].Length - 1);

                    //服务端转发消息到相应客户端
                    var talktoUser = _loginUserList.Where(v => v.UserName == talktoUserName).First();

                    talkContent = TcpHelper.PackCommmond(userName + "," + talkContent, TcpHelper.TalkCommond.Talk);
                    SendMessageToClient(talktoUser, talkContent);

                    break;

                case TcpHelper.TalkCommond.UpdateUserList:

                    userName = unPackMsg.Item2;
                    //更新用户列表(今后可过滤好友用户)
                    var firendList = GetFirendTalkUserList(userName);

                    var jsonFirendList = JsonHandler.ToJson(firendList);
                    sendMsg = TcpHelper.PackCommmond(jsonFirendList, TcpHelper.TalkCommond.UpdateUserList);
                    SendMessageToClient(currentUser, sendMsg);

                    //将当期用户登录通知每位已上线的好友
                    var onlineFriends = firendList.Where(v => v.IsOnline).Select(v => v.UserName).ToList();
                    var onlineUsers   = _loginUserList.Where(v => onlineFriends.Contains(v.UserName)).ToList();
                    foreach (var ur in onlineUsers)
                    {
                        //获取好友列表
                        firendList     = GetFirendTalkUserList(ur.UserName);
                        jsonFirendList = JsonHandler.ToJson(firendList);
                        sendMsg        = TcpHelper.PackCommmond(jsonFirendList, TcpHelper.TalkCommond.UpdateUserList);
                        SendMessageToClient(ur, sendMsg);
                    }

                    break;

                default:
                    AddMessage("未定义命令:" + commond);
                    break;
                }
            }
        }
Пример #8
0
        private void ReceiveData()
        {
            while (true)
            {
                try
                {
                    var getMsg    = _clientInstance.br.ReadString();
                    var unPackMsg = TcpHelper.UnPackCommond(getMsg);
                    var commond   = unPackMsg.Item1;
                    switch (commond)
                    {
                    case TcpHelper.TalkCommond.Logout:

                        //获取好友列表
                        var sendCommond = TcpHelper.PackCommmond(_userName, TcpHelper.TalkCommond.UpdateUserList);
                        _clientInstance.SendMessage(sendCommond);

                        break;

                    case TcpHelper.TalkCommond.UpdateUserList:
                        try
                        {
                            //获取用户列表
                            var userList = JsonHandler.UnJson <List <TalkUser> >(unPackMsg.Item2);

                            //线程中不能操作UI
                            System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
                            {
                                CleanUserList();
                                userList = userList.OrderByDescending(v => v.IsOnline).ToList();
                                foreach (var user in userList)
                                {
                                    AddUserToList(user);
                                }
                            }));
                        }catch (Exception e)
                        {
                            MessageBox.Show(e.Message);
                        }


                        break;

                    case TcpHelper.TalkCommond.Talk:
                        var talkMsgs         = unPackMsg.Item2.Split(',');
                        var talkFromUserName = talkMsgs[0];
                        var talkContent      = unPackMsg.Item2.Substring(talkMsgs[0].Length + 1, unPackMsg.Item2.Length - talkMsgs[0].Length - 1);

                        //将消息存入临时列表
                        StoreTalkMessage(talkFromUserName, talkContent);

                        //判断聊天窗口是否打开
                        TalkWindow tw = IsTalkWindowOpen(talkFromUserName);
                        if (tw == null)
                        {
                            //如果聊天窗口没有打开,则将显示消息条数提示
                            var messageCount = MessageList.memory[talkFromUserName].Count();
                            MessageList.SetMessageTipList(talkFromUserName, messageCount);
                            MessageList.resetMessageTip = true;
                        }

                        break;

                    default:
                        MessageBox.Show(getMsg);
                        break;
                    }
                }catch (Exception e)
                {
                    _clientInstance.CloseConnect();
                    return;
                }
            }
        }