用WPF编写一个Socekt的Client程序,要求不停的接受来自客户端的消息,并且接受消息为异步操作
时间: 2024-02-11 07:06:39 浏览: 20
以下是一个简单的WPF Socket Client程序,可以不停的接收来自服务器的消息,并将其显示在UI界面上。为了实现接收消息的异步操作,我们使用了Socket的BeginReceive和EndReceive方法。
```csharp
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows;
namespace WpfSocketClient
{
public partial class MainWindow : Window
{
private Socket clientSocket;
private byte[] buffer = new byte[1024];
private StringBuilder messageBuilder = new StringBuilder();
public MainWindow()
{
InitializeComponent();
ConnectToServer();
}
private void ConnectToServer()
{
try
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888));
messageBuilder.Append("Connected to server.\n");
ReceiveMessage();
}
catch (Exception ex)
{
messageBuilder.Append("Failed to connect to server: " + ex.Message + "\n");
}
}
private void ReceiveMessage()
{
try
{
clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
}
catch (Exception ex)
{
messageBuilder.Append("Failed to receive message: " + ex.Message + "\n");
}
}
private void OnReceive(IAsyncResult ar)
{
try
{
int bytesRead = clientSocket.EndReceive(ar);
if (bytesRead > 0)
{
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
messageBuilder.Append("Received message: " + message + "\n");
Dispatcher.Invoke(() => { messageTextBox.Text = messageBuilder.ToString(); });
ReceiveMessage();
}
else
{
messageBuilder.Append("Server closed the connection.\n");
Dispatcher.Invoke(() => { messageTextBox.Text = messageBuilder.ToString(); });
}
}
catch (SocketException ex)
{
messageBuilder.Append("Socket exception: " + ex.Message + "\n");
Dispatcher.Invoke(() => { messageTextBox.Text = messageBuilder.ToString(); });
}
catch (Exception ex)
{
messageBuilder.Append("Exception: " + ex.Message + "\n");
Dispatcher.Invoke(() => { messageTextBox.Text = messageBuilder.ToString(); });
}
}
}
}
```
在这个程序中,我们首先在MainWindow的构造函数中调用ConnectToServer方法来连接到服务器。在ConnectToServer方法中,我们创建了一个Socket对象,并使用Connect方法连接到服务器。如果连接失败,我们将在messageTextBox中显示错误消息。
接下来,在ReceiveMessage方法中,我们使用Socket的BeginReceive方法开始异步接收来自服务器的消息。在OnReceive回调方法中,我们使用Socket的EndReceive方法获取接收到的消息,并将其显示在messageTextBox中。然后我们再次调用ReceiveMessage方法来等待下一条消息。
需要注意的是,由于UI线程和Socket的回调方法运行在不同的线程上,我们需要使用Dispatcher.Invoke方法来将更新UI的操作切换回UI线程上。