- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[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
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#:
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!