C# UDP Socket client and server

前端 未结 3 1144
忘掉有多难
忘掉有多难 2020-12-04 20:37

My first question here. I am new to this kind of programming, and i\'ve only programmed .NET web sites and forms.

Now, the company I work at, asks me to make an Acti

相关标签:
3条回答
  • 2020-12-04 20:51

    Simple server and client:

    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");
        }
    }
    
    0 讨论(0)
  • 2020-12-04 21:02

    Simple server and client:

    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);
        }
    }
    
    0 讨论(0)
  • 2020-12-04 21:03

    Server

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

    And initialize the thread

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

    Client

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

    Insert it to button command.

    Source: http://technotif.com/creating-simple-udp-server-client-transfer-data-using-c-vb-net/

    0 讨论(0)
提交回复
热议问题