C#,窗体Form1创建了UDP的接收端和发送端,在Form2也能接收到UDP数据的完整代码
时间: 2024-09-10 18:30:57 浏览: 62
C#中,如果你想要在两个不同的窗体(Form1 和 Form2)之间共享UDP通信,你可以按照下面的步骤操作:
首先,确保你的项目引用了`System.Net.Sockets`命名空间,这个命名空间包含了处理网络套接字的功能。
**在Form1中设置UDP接收端:**
```csharp
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
public partial class Form1 : Form
{
private UdpClient udpReceiver;
public Form1()
{
InitializeComponent();
udpReceiver = new UdpClient(YourPortNumber); // 替换为你想监听的端口
BeginReceive(); // 开始接收
}
private void BeginReceive()
{
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, YourPortNumber);
byte[] buffer = new byte[BufferSize]; // 缓冲区大小
while (true)
{
DataReceivedEventArgs e = udpReceiver.BeginReceive(buffer, 0, buffer.Length, endPoint, new AsyncCallback(ReceiveData), null);
}
}
private void ReceiveData(IAsyncResult result)
{
try
{
udpReceiver.EndReceive(result);
string receivedData = Encoding.ASCII.GetString(buffer); // 假设数据是以ASCII编码的
// 在这里可以更新UI或者其他处理逻辑,并将数据传递给Form2
if (Form2.IsVisible) // 检查Form2是否可见
Form2.ReceiveData(receivedData); // Form2需要有一个类似的方法来接收数据
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
// Form1关闭时停止接收数据
protected override void OnClosing(CancelEventArgs e)
{
udpReceiver.Close();
base.OnClosing(e);
}
}
// Form2需要一个方法来接收并处理数据
partial class Form2 : Form
{
public delegate void ReceiveDataHandler(string data);
public event ReceiveDataHandler ReceiveDataEvent;
public void RaiseReceiveDataEvent(string data)
{
if (ReceiveDataEvent != null)
ReceiveDataEvent(data);
}
}
```
**在Form2中添加事件处理并接收数据:**
```csharp
public partial class Form2 : Form
{
// ...
private void Form2_Load(object sender, EventArgs e)
{
// 在Form2加载时订阅Form1的数据接收事件
Form1 form1 = Application.OpenForms["Form1"] as Form1; // 假设这两个窗体都已显示
if (form1 != null)
form1.RecvieveData += OnReceiveDataFromForm1;
}
private void OnReceiveDataFromForm1(string data)
{
// 在此处处理数据
RaiseReceiveDataEvent(data); // 触发自己的事件,以便其他地方响应
}
// Form2关闭时取消事件订阅
protected override void OnClosing(CancelEventArgs e)
{
if (Form1 != null)
Form1.ReceiveData -= OnReceiveDataFromForm1;
base.OnClosing(e);
}
}
```
现在,当你在Form1发送UDP数据时,只要Form2可见,它就能接收到并处理数据。请注意,你需要替换`YourPortNumber`、`BufferSize`以及任何其他特定于项目的变量。
阅读全文