Я пытаюсь изучить программирование сокетов UDP на C#. Я создал WinForm, который будет отправлять данные, код указан ниже. Это небольшая форма с тремя текстовыми полями и кнопкой.
using System;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace UDP_example
{
public partial class Form1 : Form1
{
public Form1()
{
InitializeComponent();
}
private void btnSend_Click(object sender, EventArgs e)
{
// make sure all text boxes contain data, or do nothing.
if (string.IsNullOrEmpty(txtIP.Text)) return;
if (string.IsNullOrEmpty(txtPort.Text)) return;
if (string.IsNullOrEmpty(txtMessage.Text)) return;
// convert the text into byte array
byte[] message = Encoding.ASCII.GetBytes(txtMessage.Text);
string ipAddress = txtIP.Text;
int sendPort = Convert.ToInt32(txtPort.Text);
// send the data
try
{
using (var client = new UdpClient())
{
IPEndPoint server = new IPEndPoint(IPAddress.Parse(ipAddress), sendPort);
client.Connect(server);
client.Send(message, message.Length);
}
}
// display error if one occurs
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
// clean up
txtMessage.Clear();
txtMessage.Focus();
}
}
Эта часть работает нормально. Мне нужно отобразить полученные данные в текстовом поле или окне сообщения на другой стороне соединения.
Может кто-нибудь показать мне, как это сделать? Я не знаю, как заставить сокет слушать асинхронно и отображать входящие данные на принимающей стороне. Это будет просто форма с текстовым полем или одно окно сообщения, которое отображает входящие данные.
Обновлено: Это код приема, но я хочу, чтобы он принимался с любого IP-адреса, а не только с локального. (Нашел и изменил этот фрагмент кода.)
using System;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace UDP_Server
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ConnectUDP));
}
private void ConnectUDP(object state)
{
UdpClient subscriber = new UdpClient(4345);
IPAddress addr = IPAddress.Parse("127.0.0.1");
subscriber.JoinMulticastGroup(addr);
IPEndPoint ep = null;
byte[] pdata = subscriber.Receive(ref ep);
string rdata = Encoding.ASCII.GetString(pdata);
txtReceived.Text += rdata;
}
}
}
Сегодня я прочитал много примеров и посмотрел несколько видео на YouTube, но я довольно застрял в том, что, как я думал, будет очень простым. Мое единственное требование - поместить полученные данные из порта UDP в текстовое поле. Спасибо за любую помощь.
JuanR - спасибо. Я не понимаю, как вызвать этот код при получении данных. Думаю, это моя проблема. При использовании TCP при получении данных событие запускается и обрабатывается. Я не понимаю, как вызвать событие, когда данные получены с помощью WinForm.
Стив - спасибо. Как я уже говорил выше, я не вижу, где «слушать» и отвечать на входящие данные, когда код предназначен для приложения Windows Form. Еще раз спасибо.
Как упоминалось в @JuanR, вам понадобится что-то подобное на стороне вашего сервера
// This constructor arbitrarily assigns the local port number.
UdpClient udpClient = new UdpClient(yourUDPPort);
//IPEndPoint object will allow us to read datagrams sent from any source.
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
// Blocks until a message returns on this socket from a remote host.
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);
Всем привет. В документации для класса
UdpClient
есть пример, который делает именно это: docs.microsoft.com/en-us/dotnet/api/…