Search…

Socket Client trong C#

08/07/20202 min read
Lập trình mạng với socket trong C# thông qua ví dụ lấy giờ từ server.

Lập trình socket

Lập trình socket hay được hiểu là lập trình mạng. Lập trình mạng là cách để tạo ra sự giao tiếp giữa các máy tính với nhau.

Khái niệm cơ bản

  • Server: Máy cung cấp dịch vụ.
  • Client: Máy yêu cầu dịch vụ.
  • IP: định danh máy tính trên mạng.
  • Port: định danh 1 dịch vụ (phần mềm mạng) đang chạy trên 1 máy tính.
  • Socket: đối tượng socket hỗ trợ kết nối, các giao thức và các thao tác gửi nhận dữ liệu qua mạng.

Code đầy đủ

using System;
using System.Net.Sockets;
using System.Text;

namespace STDIOTraining
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpClient client = new TcpClient();
            client.Connect("time.nist.gov", 13);

            NetworkStream netStream = client.GetStream();
            byte[] bytes = new byte[client.ReceiveBufferSize];
            netStream.Read(bytes, 0, client.ReceiveBufferSize);
            
            var message = Encoding.ASCII.GetString(bytes);
            message = DateTime.Parse("20" + message.Substring(7, 17));
            
            Console.WriteLine(message);
            
            client.Close();
        }
    }
}

Giải thích

using System.Net.Sockets;

Khai báo using System.Net.Sockets để sử dụng socket.

TcpClient client = new TcpClient();
client.Connect("time.nist.gov", 13);

Kết nối đến server giữ thời gian, trong bài viết này sử dụng TcpClient (trừu tượng hóa lớp socket) để kết nối đến server, thay vì trực tiếp sử dụng socket giúp code ngắn gọn và tăng tính ứng dụng thực tế hơn.

Dòng lệnh trên là kết nối đến port 13 của server time.nist.gov. Port 13 của server này hỗ trợ gửi thời gian về cho client.

NetworkStream netStream = client.GetStream();
byte[] bytes = new byte[client.ReceiveBufferSize];
netStream.Read(bytes, 0, client.ReceiveBufferSize);

Với dòng lệnh trên, dữ liệu được gửi đến, tùy vào server mã hóa dữ liệu ra sao, ta tiến hành giải mã để nhận được dữ liệu với kiểu cần thiết.

var message = Encoding.ASCII.GetString(bytes);

Với dòng đầu tiên, dữ liệu cần xuất phát điểm ở vị trí thứ 7 và nó có độ dài 17 byte.

message = DateTime.Parse("20" + message.Substring(7, 17));

Đóng kết nối đã tạo để giải phóng tài nguyên

client.Close();
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024