C#UDP套接字客户端和服务器

我的第一个问题。 我是这种编程的新手,我只编写了.NET网站和表单。

现在,我工作的公司,要求我制作一个ActiveX组件,它监听UDP消息,并将它们变成事件。

UDP消息是从Avaya系统发送的,所以我被告知要测试我的ActiveX,首先我需要创建一个只发送UDP的应用程序(只有一个发送预定义UDP字符串的按钮)。 然后创建监听器套接字,普通的C#app,它将从测试应用程序获取那些传输的UDP字符串。 两个应用程序都可以在同一台机器上运行

后来,当我得到这个工作时,我需要使监听器成为一个ActiveX组件,但首先要做的事情。

我需要知道是否有关于此的任何好的教程,以及如何开始的任何想法? 我很抱歉我的无知,但我真的很新,我真的没有时间学习这个,因为它必须在2周内完成。

提前致谢。

编辑:我设法创建了2个简单的控制台应用程序,并成功地在它们之间发送UDP消息。 发送方仅用于测试,现在我需要重新设置接收方以获取UDP消息并将其“转换”为事件。 最后,使其成为ActiveX控件……

简单服务器和客户端:

public struct Received { public IPEndPoint Sender; public string Message; } abstract class UdpBase { protected UdpClient Client; protected UdpBase() { Client = new UdpClient(); } public async Task Receive() { var result = await Client.ReceiveAsync(); return new Received() { Message = Encoding.ASCII.GetString(result.Buffer, 0, result.Buffer.Length), Sender = result.RemoteEndPoint }; } } //Server class UdpListener : UdpBase { private IPEndPoint _listenOn; public UdpListener() : this(new IPEndPoint(IPAddress.Any,32123)) { } public UdpListener(IPEndPoint endpoint) { _listenOn = endpoint; Client = new UdpClient(_listenOn); } public void Reply(string message,IPEndPoint endpoint) { var datagram = Encoding.ASCII.GetBytes(message); Client.Send(datagram, datagram.Length,endpoint); } } //Client class UdpUser : UdpBase { private UdpUser(){} public static UdpUser ConnectTo(string hostname, int port) { var connection = new UdpUser(); connection.Client.Connect(hostname, port); return connection; } public void Send(string message) { var datagram = Encoding.ASCII.GetBytes(message); Client.Send(datagram, datagram.Length); } } class Program { static void Main(string[] args) { //create a new server var server = new UdpListener(); //start listening for messages and copy the messages back to the client Task.Factory.StartNew(async () => { while (true) { var received = await server.Receive(); server.Reply("copy " + received.Message, received.Sender); if (received.Message == "quit") break; } }); //create a new client var client = UdpUser.ConnectTo("127.0.0.1", 32123); //wait for reply messages from server and send them to console Task.Factory.StartNew(async () => { while (true) { try { var received = await client.Receive(); Console.WriteLine(received.Message); if (received.Message.Contains("quit")) break; } catch (Exception ex) { Debug.Write(ex); } } }); //type ahead :-) string read; do { read = Console.ReadLine(); client.Send(read); } while (read != "quit"); } } 

简单服务器和客户端:

 using System; using System.Text; using System.Net; using System.Net.Sockets; class Program { static void Main(string[] args) { // Create UDP client int receiverPort = 20000; UdpClient receiver = new UdpClient(receiverPort); // Display some information Console.WriteLine("Starting Upd receiving on port: " + receiverPort); Console.WriteLine("Press any key to quit."); Console.WriteLine("-------------------------------\n"); // Start async receiving receiver.BeginReceive(DataReceived, receiver); // Send some test messages using (UdpClient sender1 = new UdpClient(19999)) sender1.Send(Encoding.ASCII.GetBytes("Hi!"), 3, "localhost", receiverPort); using (UdpClient sender2 = new UdpClient(20001)) sender2.Send(Encoding.ASCII.GetBytes("Hi!"), 3, "localhost", receiverPort); // Wait for any key to terminate application Console.ReadKey(); } private static void DataReceived(IAsyncResult ar) { UdpClient c = (UdpClient)ar.AsyncState; IPEndPoint receivedIpEndPoint = new IPEndPoint(IPAddress.Any, 0); Byte[] receivedBytes = c.EndReceive(ar, ref receivedIpEndPoint); // Convert data to ASCII and print in console string receivedText = ASCIIEncoding.ASCII.GetString(receivedBytes); Console.Write(receivedIpEndPoint + ": " + receivedText + Environment.NewLine); // Restart listening for udp data packages c.BeginReceive(DataReceived, ar.AsyncState); } } 

服务器

 public void serverThread() { UdpClient udpClient = new UdpClient(8080); while(true) { IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); string returnData = Encoding.ASCII.GetString(receiveBytes); lbConnections.Items.Add(RemoteIpEndPoint.Address.ToString() + ":" + returnData.ToString()); } } 

并初始化线程

 private void Form1_Load(object sender, System.EventArgs e) { Thread thdUDPServer = new Thread(new ThreadStart(serverThread)); thdUDPServer.Start(); } 

客户

 private void button1_Click(object sender, System.EventArgs e) { UdpClient udpClient = new UdpClient(); udpClient.Connect(txtbHost.Text, 8080); Byte[] senddata = Encoding.ASCII.GetBytes("Hello World"); udpClient.Send(senddata, senddata.Length); } 

将其插入按钮命令。

资料来源: http : //technotif.com/creating-simple-udp-server-client-transfer-data-using-c-vb-net/