【问题标题】:C# UDP Socket client and serverC# UDP Socket 客户端和服务器
【发布时间】:2013-11-05 10:24:05
【问题描述】:

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

现在,我工作的公司要求我制作一个 ActiveX 组件,它侦听 UDP 消息并将它们转换为事件。

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

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

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

提前致谢。

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

【问题讨论】:

    标签: c# sockets udp activex


    【解决方案1】:

    简单的服务器和客户端:

    public struct Received
    {
        public IPEndPoint Sender;
        public string Message;
    }
    
    abstract class UdpBase
    {
        protected UdpClient Client;
    
        protected UdpBase()
        {
            Client = new UdpClient();
        }
    
        public async Task<Received> 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");
        }
    }
    

    【讨论】:

    • 由于 OP 明确要求使用 UDP,因此您不应将他引向错误的方向。 UdpClient (msdn.microsoft.com/en-us/library/…) 会更好地解决他的问题...
    • 是的,他们要求的是 UDP,而不是 TCP。我做了一些测试监听器和服务器,但无法连接它们。当我从服务器发送消息时,客户端没有收到它。起初我以为我的公司 FW 阻止了传输,但后来两个应用程序(都是控制台应用程序)又在同一台机器上同时运行,所以......有什么想法吗?
    • 同意!用一个小演示纠正了我的错误
    • 谢谢。它确实帮助我更多地了解它的工作原理,并设法创建了 2 个简单的控制台应用程序(侦听器和发送器),并成功地在它们之间发送 UDP 消息。发送方仅用于测试,现在我需要重新制作接收方以获取 UDP 消息并将其“翻译”为事件。最后,使它成为一个 ActiveX 控件...任何提示我应该如何开始?请注意,我之前已经做过这个,但是作为输入得到了事件,现在将得到字符串,并为桌面应用程序做了,现在我需要取出该代码并创建一个 activex .. 愚蠢的业务:)
    • 给我发一封电子邮件,我们会看到
    【解决方案2】:

    简单的服务器和客户端:

    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);
        }
    }
    

    【讨论】:

      【解决方案3】:

      服务器

      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/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多