NEWS

[C#] Lập trình ứng dụng lấy ngày giờ hệ thống mạng LAN sử dụng giao thức UDP

[C#] Lập trình ứng dụng lấy ngày giờ hệ thống mạng LAN sử dụng giao thức UDP
Đăng bởi: Thảo Meo - Lượt xem: 3025 10:19:30, 05/06/2023C#   In bài viết

Xin chào các bạn, bài viết hôm nay mình hướng dẫn các bạn ứng dụng đơn giản trong lập trình mạng lấy ngày giờ hệ thống từ server máy chủ sử dụng giao thức UDP trong lập trình C#, winform.

[C#] Lập trình ứng dụng lấy ngày giờ hệ thống trong mạng LAN 

Giao diện demo ứng dụng C#:

udp_demo

Video hướng dẫn step by step:

Tạo một class UDPClient.cs với source code như sau:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DemoUDPSocket
{
    public partial class FrmClient : Form
    {
        private const int serverPort = 8888;
        private static IPAddress serverIP = IPAddress.Parse("127.0.0.1"); // địa chị của ip server
        public FrmClient()
        {
            InitializeComponent();
        }

        private void btnGetTime_Click(object sender, EventArgs e)
        {
            // Khởi tạo đối tượng socket
            using (Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
                try
                {
                    // kết nối đến server
                    IPEndPoint serverEndPoint = new IPEndPoint(serverIP, serverPort); 
                    clientSocket.Connect(serverEndPoint);

                    // gởi yêu cầu lấy ngày giờ hệ thống đến server
                    byte[] requestBytes = Encoding.UTF8.GetBytes("GET_TIME");
                    clientSocket.Send(requestBytes);

                    // nhận dữ liệu từ server
                    byte[] receiveBuffer = new byte[1024];
                    int receivedBytes = clientSocket.Receive(receiveBuffer);

                    // hiển thị ngày giờ nhận được vào label
                    string timeServer = Encoding.UTF8.GetString(receiveBuffer, 0, receivedBytes);
                    lblReceiveTime.Text = timeServer;
                }
                catch (Exception ex)
                {

                    MessageBox.Show(ex.Message);
                }
            }
        }
    }
}

Ở source code Client.cs ở trên, chúng ta sử dụng lớp Socket để tạo một đối tượng socket UDP. Đầu tiên, chúng ta khởi tạo socket với các thông số AddressFamily.InterNetwork (IPv4), SocketType.Dgram (UDP), và ProtocolType.Udp. Sau đó, chúng ta kết nối tới server bằng cách sử dụng phương thức Connect và truyền địa chỉ IP và cổng của server.

Sau khi kết nối thành công, chúng ta gửi yêu cầu lấy ngày giờ hệ thống tới server bằng cách chuyển chuỗi "GET_TIME" thành mảng byte và gửi đi qua socket sử dụng phương thức Send.

Tiếp theo, chúng ta chuẩn bị một bộ đệm (receiveBuffer) để nhận dữ liệu từ server. Khi dữ liệu được nhận về, chúng ta chuyển đổi từ mảng byte sang chuỗi sử dụng mã hóa ASCII và hiển thị nó trên màn hình.

Lưu ý rằng trong ví dụ này, địa chỉ IP của server được đặt là "127.0.0.1" và cổng là 8888. Bạn có thể thay đổi các giá trị này tùy theo cài đặt của server UDP thực tế.

Source code Server.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Server
{
    internal class Program
    {
        private const int serverPort = 8888;
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8; // allow utf-8
            using (var serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
                try
                {
                    // Assign Ipadress and port for server
                    IPEndPoint serverEndpoint = new IPEndPoint(IPAddress.Any, serverPort);
                    serverSocket.Bind(serverEndpoint);
                    Console.WriteLine($"Đợi yêu cầu từ client..., server listen port: {serverPort}");
                    while (true)
                    {
                        // nhận yêu cầu từ client.
                        byte[] receiveBuffer = new byte[1024];
                        EndPoint clientEndPoint = new IPEndPoint(IPAddress.Any, 0);
                        int receivedBytes = serverSocket.ReceiveFrom(receiveBuffer,ref  clientEndPoint);
                        // chuyển đổi yêu cầu từ mảng byte sang chuỗi text
                        string requestString = Encoding.UTF8.GetString(receiveBuffer,0, receivedBytes);

                        // Ghi nhận yêu cầu client từ IP
                        string clientIP = ((IPEndPoint)clientEndPoint).Address.ToString();
                        Console.WriteLine("Nhận yêu cầu từ client IP: " + clientIP);

                        if (requestString == "GET_TIME") {
                            // lấy ngày hệ thống hiện tại
                            string timeString = "Ngày giờ hệ thống từ server: " + DateTime.Now.ToString();

                            // Gởi ngày giờ hệ thống về cho Client
                            byte[] responseBytes = Encoding.UTF8.GetBytes(timeString);
                            serverSocket.SendTo(responseBytes, clientEndPoint);
                            Console.WriteLine($"Gởi thời gian đến client: {clientIP} => {timeString}" );
                        }

                    }
                }
                catch (Exception ex)
                {

                    // hiện thị lỗi
                    Console.WriteLine (ex.ToString());  
                }
            }
        }
    }
}

Source code server.cs ở trên, chúng ta sử dụng lớp Socket để tạo một đối tượng socket UDP cho server. Đầu tiên, chúng ta khởi tạo socket với các thông số AddressFamily.InterNetwork (IPv4), SocketType.Dgram (UDP), và ProtocolType.Udp.

Sau đó, chúng ta gán địa chỉ IP của server là IPAddress.Any để lắng nghe tất cả các giao diện mạng trên máy chủ và gán cổng là 8888 bằng cách sử dụng phương thức Bind.

Sau khi server đã sẵn sàng, chúng ta bắt đầu vòng lặp vô hạn để nhận yêu cầu từ client.

Khi nhận được yêu cầu, chúng ta chuyển đổi từ mảng byte sang chuỗi sử dụng mã hóa ASCII.

Nếu yêu cầu là "GET_TIME", chúng ta lấy ngày giờ hệ thống bằng cách sử dụng DateTime.Now.ToString().

Sau đó, chúng ta chuyển đổi ngày giờ thành mảng byte và gửi nó cho client sử dụng phương thức SendTo.

Lưu ý rằng trong ví dụ này, cổng của server được đặt là 8888. Bạn có thể thay đổi giá trị này tùy theo yêu cầu của bạn.

 

Thanks for watching!

 

DOWNLOAD SOURCE

THÔNG TIN TÁC GIẢ

BÀI VIẾT LIÊN QUAN

[C#] Lập trình ứng dụng lấy ngày giờ hệ thống mạng LAN sử dụng giao thức UDP
Đăng bởi: Thảo Meo - Lượt xem: 3025 10:19:30, 05/06/2023C#   In bài viết

CÁC BÀI CÙNG CHỦ ĐỀ

Đọc tiếp
.