Hướng dẫn tự học lập trình socket (mạng) với C#

0

Lập trình mạng (hay còn gọi là lập trình socket) là nền tảng về kỹ thuật để phát triển các ứng dụng hoạt động trên mạng (LAN hoặc Internet). Dĩ nhiên, bạn có thể lập trình ứng dụng mạng (như ứng dụng web, ứng dụng hướng dịch vụ) mà không cần nắm rõ về lập trình socket. Tuy nhiên, ở phía dưới các công nghệ bạn sử dụng đều là lập trình socket. Lập trình socket cho phép chương trình ứng dụng tương tác với ngăn xếp dịch vụ mạng của hệ điều hành.

Tập bài giảng này sẽ hướng dẫn bạn tự học lập trình mạng (lập trình socket) với bộ giao thức Tcp/Ip trên hệ điều hành windows sử dụng C# và .NET framework. Tập bài giảng này có thể được sử dụng như một tài liệu thực hành bổ sung cho các khóa học về mạng máy tính cơ bản, cũng như một giáo trình độc lập về lập trình socket cho sinh viên các ngành Công nghệ thông tin, điều khiển, tự động hóa.

Để chuyển tới bài học có thể sử dụng Mục lục trên sidebar, Mục lục ở cuối bài hoặc click vào link dưới đây để chuyển tới danh mục bài học.
>> CHUYỂN TỚI DANH MỤC BÀI HỌC <<

Mạng máy tính và lập trình mạng (socket)

Hiện nay, hầu hết các khóa học về mạng máy tính giảng dạy ở các trường đại học thường chỉ giảng dạy lý thuyết. Các giáo trình mạng thường thiên về mô tả ngăn xếp giao thức (protocol stack) một cách hình tượng, sử dụng toán học và phân tích để truyền đạt các nguyên lý về mạng. Các nội dung về lập trình hầu như không được đề cập tới.

Đối với các môn học về lập trình (kể cả phát triển ứng dụng hoạt động trên môi trường mạng như SOA, web), người học hầu như không được/cần biết về hoạt động truyền thông bên dưới các thành phần của ứng dụng.

Như vậy, mạng máy tính và lập trình phát triển ứng dụng đang tồn tại song song và gần như hoàn toàn độc lập với nhau trong khuôn khổ các chương trình đào tạo.

Qua kinh nghiệm giảng dạy, chúng tôi thấy rằng, nếu sinh viên trực tiếp làm việc với các giao thức mạng để tạo ra chương trình ứng dụng, họ có thể hiểu kỹ càng hơn về giao thức đó. Khi lập trình với giao thức sử dụng socket, sinh viên giờ không còn đứng từ xa để nhìn giao thức nữa mà đang thực sự “sờ mó” và “nhào nặn” giao thức để tạo ra ứng dụng. Qua đó, những thứ vốn trừu tượng như cấu trúc gói tin giờ trở nên thực tế hơn.

Thứ hai, chúng tôi nhận thấy rằng sinh viên khi hiểu cách các chương trình sử dụng các dịch vụ của TCP / IP thường dễ dàng nắm bắt các nguyên tắc của các giao thức cơ bản thực hiện các dịch vụ đó.

Cuối cùng, việc tự mình tạo ra được sản phẩm có thể tạo thêm hứng thú cho sinh viên và tăng sức hấp dẫn của môn học (vốn thường được xem là khô khan và trừu tượng).

Mục tiêu của bài giảng

Hiện nay trên Internet có rất nhiều các blog post về lập trình socket với giao thức mạng. Các blog post như vậy thường chỉ cung cấp một vài ví dụ về lập trình socket Tcp và Udp. Chúng cũng thường khá rời rạc, không hệ thống và thiếu bài bản. Các giáo trình/ tài liệu chuyên về lập trình socket lại rất dày và cung cấp lượng kiến thức khổng lồ gây khó khăn cho việc theo học (với người mới bắt đầu).

Vì các lý do trên, chúng tôi xây dựng tập bài giảng này hướng tới giới thiệu các kỹ thuật lập trình socket cơ bản nhằm mục đích hỗ trợ cho việc học các khóa về mạng máy tính căn bản. Vì mục đích đó, tài liệu này cố gắng đơn giản hóa và giới thiệu một cách nhẹ nhàng các vấn đề có liên quan giúp người mới bắt đầu có được một xuất phát điểm tốt.

Tập bài giảng này cũng được xây dựng và sử dụng như một tài liệu độc lập về lập trình socket. Với mục đích này, tài liệu cố gắng trình bày các vấn đề một cách bài bản, đầy đủ và hệ thống.

Bài giảng này dành cho ai?

Bài giảng này chủ yếu dành cho sinh viên đã hoặc đang tham gia các khóa học về mạng máy tính. Bài giảng này khi đó đóng vai trò bổ sung kiến thức và kỹ thuật lập trình với giao thức mạng, giúp sinh viên hiểu rõ và sâu hơn về mạng máy tính và giao thức. Cũng do đó, bài giảng này không tập trung nhiều vào giải thích các vấn đề của mạng máy tính.

Bài giảng này cũng hướng tới người học đang cần bắt đầu với lập trình mạng, giúp người học nắm được cách thức lập trình socket trên .NET framework, làm nền tảng để có thể tiến xa hơn trong lĩnh vực phát triển ứng dụng mạng.

Chúng tôi giả định người học đã có các kỹ năng và kinh nghiệm lập trình cơ bản với C#; đã nắm được các khái niệm của lập trình C# như lớp, phương thức, giao diện, và thừa kế cơ bản; có khả năng tự xây dựng một chương trình đơn giản với C# và .NET framework. Vì vậy, tài liệu này cũng không đi vào giải thích các kỹ thuật lập trình C# căn bản mà chỉ vận dụng chúng.

Giả định thứ hai là người học đã nắm được những khái niệm cơ bản về mạng máy tính, như giao thức và mô hình mạng, kiến trúc phân tầng, cách thức đóng/mở gói tin. Với giả định như vậy, tài liệu này sẽ không đi chi tiết vào các nội dung của mạng máy tính.

Cần học gì trước?

Để theo được khóa học, sinh viên cần có kiến thức và kỹ năng lập trình C# cơ bản. Tất cả các ví dụ trong bài giảng được xây dựng trên .NET framework sử dụng ngôn ngữ C#. Một số ví dụ hướng thực tế được xây dựng với kỹ thuật lập trình C#.NET nâng cao.

Lưu ý rằng đây là một tài liệu chuyên về lập trình mạng với .NET framework, không phải là một tài liệu về lập trình C#. Chúng ta sẽ không đề cập đến các vấn đề cơ bản của lập trình C# ở đây. Để có thể theo dõi các ví dụ của bài giảng, các bạn cần nắm vững ngôn ngữ lập trình C#, kỹ thuật lập trình hướng đối tượng trong C#, cách lập trình với các thư viện của .NET framework, cũng như một số kỹ thuật lập trình .NET nâng cao.

Sinh viên nên đọc thêm về kiến trúc và thiết kế phần mềm ứng dụng để có thể dễ dàng nắm bắt các ví dụ. Trong bài giảng có sử dụng một số mẫu thiết kế và kiến trúc phần mềm thông dụng để xây dựng các ví dụ nâng cao.

Để hiểu được rõ hơn và có cái nhìn tổng thể về quá trình truyền thông, sinh viên cần có kiến thức cơ bản về mạng máy tính và bộ giao thức Tcp/Ip. Mặc dù tài liệu có trình bày chi tiết về các giao thức Ip, Tcp, Udp và một số giao thức tầng ứng dụng, cách nhìn nhận về các giao thức này có sự khác biệt với nội dung trình bày trong môn Mạng máy tính.

Lập trình socket (lập trình mạng)

Để lập trình với các giao thức mạng, các hệ điều hành thường cung cấp bộ giao diện lập trình ứng dụng (Application Programming Interface, API) gọi là socket API. Do đó, lập trình mạng cũng thường được gọi là lập trình socket.

Giao diện Berkeley Sockets được xem như là bộ API chuẩn dành cho lập trình socket và được sử dụng rộng rãi trên nhiều hệ điều hành. Hệ điều hành windows xây dựng bộ socket API của mình dựa trên Berkeley Sockets và được gọi là winsock. Winsock là bộ API tiêu chuẩn để lập trình mạng trong windows.

Bộ API socket này được thiết kế để giúp chương trình truy cập vào các dịch vụ truyền thông liên tiến trình của hệ điều hành. Các dịch vụ này có thể được thực hiện bởi bất kỳ giao thức nào mà hệ điều hành hỗ trợ (như IPX, Appletalk, TCP / IP, v.v.).

Do cách tiếp cận chung này, socket API có vẻ rất phức tạp nếu mới tiếp xúc. Nhưng trên thực tế, những kỹ thuật cơ bản của lập trình socket sử dụng bộ giao thức TCP / IP không quá phức tạp.

Học lập trình socket chính là việc học sử dụng các API do chương trình TCP và UDP của hệ thống để yêu cầu các chương trình này thực hiện trao đổi dữ liệu qua mạng theo yêu cầu của mình. Việc gọi đến các API của hệ thống thường phù hợp khi lập trình với một số ngôn ngữ và công nghệ nhất định, ví dụ khi sử dụng C/C++/Delphi xây dựng ứng dụng native cho windows.

Tuy nhiên, sử dụng các ngôn ngữ và công cụ bậc “không cao” như C/C++ làm tăng thời gian phát triển ứng dụng (giảm năng suất). Các API hệ thống thường rất phức tạp với rất nhiều tham số càng khiến việc lập trình khó khăn hơn.

Bài giảng này tập trung vào hướng dẫn cách học lập trình socket sử dụng .NET framework với ngôn ngữ lập trình C#. Do việc lập trình socket khá tương đồng nhau dù sử dụng các ngôn ngữ và nền tảng khác nhau, người học hoàn toàn có thể đem vận dụng sang các ngôn ngữ và nền tảng khác.

Tại sao lập trình socket trong .NET?

Các công nghệ phát triển ứng dụng hiện đại thường hạn chế việc truy xuất trực tiếp đến các API của hệ thống. Thay vào đó, các công nghệ này thường tạo ra các “vỏ bọc” (wrapper) để giúp người lập trình gọi đến các API của hệ thống một cách dễ dàng hơn.

Tương tự, đối với socket API. .NET framework cũng tạo ra các lớp wrapper như vậy để giúp người lập trình gọi các hàm của TCP hay UDP mà không cần tiếp xúc trực tiếp với socket API, qua đó giúp tăng hiệu quả và đơn giản hóa việc lập trình truyền thông. Các lớp wrapper này giúp người lập trình sử dụng các kỹ thuật lập trình .NET mạnh mẽ và quen thuộc trong lập trình socket.

.NET framework cũng có những hỗ trợ khác (không riêng) cho lập trình mạng như:

  • giao diện luồng dữ liệu (stream),
  • trình tự hóa dữ liệu (serialization),
  • biến đổi dữ liệu (data conversion),
  • lập trình bất đồng bộ (asynchronous programming),
  • lập trình đa luồng (multi-threading programming),
  • tạo bộ đệm (caching),
  • bảo mật (socket security, crypto-stream).

Các hỗ trợ này đóng vai trò đặc biệt quan trọng khi xây dựng thành phần server và cài đặt giao thức.

Kết luận

Trong khuôn khổ bài giảng này, chúng ta sẽ nghiên cứu cách lập trình socket trên .NET framework với ngôn ngữ C#.

Các nguyên tắc cơ bản của lập trình socket là tương tự nhau mặc dù sử dụng các công cụ khác nhau.

Nắm bắt được cách lập trình socket trên .NET có thể hoàn toàn dễ dàng tiếp cập lập trình socket, ví dụ, trên Java, hay Python, Rubi, v.v..

Chúc bạn học tập hiệu quả!

* Bản quyền bài viết thuộc về Tự học ICT. Đề nghị tôn trọng bản quyền. DMCA.com Protection Status
Subscribe
Notify of
guest
0 Thảo luận
Inline Feedbacks
View all comments