using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Net.Sockets;//socket库 using System.Net.Http; using System.Net; using System.IO; using System; using System.Security.Policy; using log4net; using log4net.Config; using System.Text.Json; using chatapi; using System.Diagnostics; using System.Windows.Interop; using ControlzEx.Standard; using System.ComponentModel; [assembly: XmlConfigurator(ConfigFile = "config/log4net.config", Watch = true)] namespace chatclient { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window, INotifyPropertyChanged { LoginWindow Login = new(); static string? receive; public static string? UserName = null; private static readonly ILog log = LogManager.GetLogger(typeof(MainWindow)); public static Socket? Client; public static readonly HttpClient HttpClient = new HttpClient(); public event PropertyChangedEventHandler? PropertyChanged; private string? _Username; public string? Username { get { return _Username; } set { _Username = value; Update("Username"); } } private void Update(string UpdateName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(UpdateName)); } public MainWindow() { InitializeComponent(); this.DataContext = this; log.Info("Hello World!"); this.Hide(); Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { log.Info($"连接服务器 {Server.ServerIP}:{Server.ServerPort} "); Client.Connect(Server.ServerIP, Server.ServerPort); } catch (Exception ex) { Client.Close(); log.Error(ex); } Login.Show(); Thread th = new Thread(Receive); th.Start(); } static void Receive() { byte[] buffer = new byte[1024]; try { while (true) { int num = Client!.Receive(buffer); if (num == 0) break; if (Client.Poll(100, SelectMode.SelectRead) && Client.Available == 0 || !Client.Connected) { log.Error("连接已断开"); break; } receive = Encoding.UTF8.GetString(buffer, 0, num); response(receive); } } catch (Exception ex) { log.Error(ex); } finally { Client?.Close(); } } static void response(string msg) { log.Info($"收到服务器消息: {msg}"); try { var Type = JsonSerializer.Deserialize(msg); if (Type != null) { var LoginResponse = JsonSerializer.Deserialize(msg); if (Type.type == "login_1") { if (LoginResponse!.status == "success" && LoginResponse != null) { log.Info($"用户 {UserName} 登录成功"); Application.Current.Dispatcher.Invoke(() => { var mainWindow = Application.Current.Windows.OfType().FirstOrDefault(); if (mainWindow != null) { mainWindow.Username = UserName; mainWindow.Show(); var loginWindow = Application.Current.Windows.OfType().FirstOrDefault(); loginWindow?.Close(); mainWindow.Activate(); } }); } else if (LoginResponse != null) { log.Warn($"登录失败: {LoginResponse.message}\nMsg:{msg}"); var loginWindow = Application.Current.Windows.OfType().FirstOrDefault(); loginWindow!.LoginMsg = LoginResponse.message; } } else if (Type.type == "login_0") { if (LoginResponse != null) { var loginWindow = Application.Current.Windows.OfType().FirstOrDefault(); loginWindow!.LoginMsg = LoginResponse.message; } else { var loginWindow = Application.Current.Windows.OfType().FirstOrDefault(); loginWindow!.LoginMsg = "服务器返回错误"; } } } } catch (JsonException ex) { log.Error("JSON解析错误", ex); } catch (Exception ex) { log.Error("处理响应时发生错误", ex); } } } }