16 June, 2023

[C#] Programming an application to get the date and time system in the LAN

Như tiêu đề bài viết tạm dịch là "LẬP TRÌNH ỨNG DỤNG LẤY NGÀY GIỜ HỆ THỐNG TRONG MẠNG LAN", như hình ảnh bên dưới.

Đây là một dạng kiểm tra sever của bạn có hoạt động hay không nhé, nếu hoạt động thì nó sẽ kiểm tra và sẽ có những thông báo ngày giờ hệ thống cho mọi người kiểm tra chính xác nhất.

Video hướng dẫn từng bước.

Bây giờ ta tạo một file class có tên "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.

Chúc các bạn thành công với thủ thuật bổ ích này. 

DOWNLOAD NOW

PASSWORD UNZIP: hungqb.com
 Theo: LapTrinhVB.Net
All Right Reserved © 2015 By Hung Pro VN
Hung.Pro.VN Sharing Your Own Knowledge and Creative Thinking Every Day and Many Other Things.