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); } }
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(); }
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(); } }
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(); } }
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; }
/// <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); } }
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; } } }
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; } } }