From 635eb14c9ce161b559975756f481151fac13cbf5 Mon Sep 17 00:00:00 2001
From: XuShanQiXun <3401460572@qq.com>
Date: Sat, 7 Jun 2025 13:25:09 +0800
Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=B6=88=E6=81=AF=E8=BE=93?=
=?UTF-8?q?=E5=85=A5=E5=8C=BA=E5=9F=9F=E5=B9=B6=E4=BC=98=E5=8C=96=E5=BC=82?=
=?UTF-8?q?=E6=AD=A5=E5=8F=91=E9=80=81=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
在 `MainWindow.xaml` 中,将消息输入区域替换为 `materialDesign:Card`,调整了 `TextBox` 和 `Button` 的布局,并新增了 `Snackbar` 用于信息提示。
在 `MainWindow.xaml.cs` 中,将 `SendMessage_Click` 和 `SendMessage` 方法修改为异步,增加了对 `Socket` 连接状态的检查,并在连接失败时提供用户提示。同时新增了 `QueueMessage` 方法以支持将消息添加到 `Snackbar` 的消息队列中。
---
chatclient/MainWindow.xaml | 29 ++++++++-------
chatclient/MainWindow.xaml.cs | 68 +++++++++++++++++++++++------------
2 files changed, 59 insertions(+), 38 deletions(-)
diff --git a/chatclient/MainWindow.xaml b/chatclient/MainWindow.xaml
index f77e9ed..094aebb 100644
--- a/chatclient/MainWindow.xaml
+++ b/chatclient/MainWindow.xaml
@@ -112,21 +112,18 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -143,5 +140,7 @@
+
+
diff --git a/chatclient/MainWindow.xaml.cs b/chatclient/MainWindow.xaml.cs
index c2b8912..ed8f474 100644
--- a/chatclient/MainWindow.xaml.cs
+++ b/chatclient/MainWindow.xaml.cs
@@ -240,11 +240,11 @@ namespace chatclient
log.Error("处理响应时发生错误", ex);
}
}
- private void SendMessage_Click(object sender, RoutedEventArgs e)
+ private async void SendMessage_Click(object sender, RoutedEventArgs e)
{
- SendMessage();
+ await SendMessage();
}
- private void SendMessage()
+ private async Task SendMessage()
{
if (string.IsNullOrWhiteSpace(txtMessage.Text))
return;
@@ -274,31 +274,53 @@ namespace chatclient
string ChatJsonData = JsonSerializer.Serialize(newChatMessage);
byte[] dataBytes = Encoding.UTF8.GetBytes(ChatJsonData);
log.Info($"向服务器聊天信息(长度:{dataBytes.Length})");
- if (Client != null)
+ // 检查Socket是否可用
+ if (Client?.Connected == true)
{
- if (Client.Connected)
+ Client.Send(dataBytes);
+ Application.Current.Dispatcher.Invoke(() =>
{
- Client.Send(dataBytes);
- }
- else
- {
- try
- {
- log.Info("未连接服务器,尝试连接");
- Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- Client.Connect(IPAddress.Parse(Server.ServerIP), Server.ServerPort);
- }
- catch (Exception ex)
- {
- log.Error(ex);
- Client.Close();
- }
- }
+ txtMessage.Clear();
+ });
+ return;
}
+ log.Info("未连接服务器,尝试异步连接");
+ // 异步连接操作
+ await Task.Run(() =>
+ {
+ try
+ {
+ Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ Client?.Connect(IPAddress.Parse(Server.ServerIP), Server.ServerPort);
+ StartReceive();
+ Client?.Send(dataBytes);
+
+ }
+ catch (Exception ex)
+ {
+ log.Error($"连接失败: {ex.Message}");
+ Client?.Close();
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var mainWindow = Application.Current.Windows.OfType().FirstOrDefault();
+ if (mainWindow != null)
+ {
+ QueueMessage("连接失败,请检查网络设置或服务器状态。");
+ }
+ });
+ }
+ });
// 添加到消息列表
//Messages.Add(newMessage);
- // 清空输入框
- txtMessage.Clear();
+ }
+ private void QueueMessage(string message)
+ {
+ if (SnackbarThree.MessageQueue is { } messageQueue)
+ {
+ //use the message queue to send a message.
+ //the message queue can be called from any thread
+ Task.Factory.StartNew(() => messageQueue.Enqueue(message));
+ }
}
}
}
\ No newline at end of file