1. Trang chủ
  2. » Thể loại khác

Luận văn tìm hiểu kĩ thuật multicast xây dựng ứng dụng hỗ trợ giảng dạy trên mạng LAN

50 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 50
Dung lượng 1,46 MB

Cấu trúc

  • CHƯƠNG 1: CÁC KIẾN THỨC CƠ BẢN VỀ MẠNG MÁY TÍNH (7)
    • 1.1. Mô hình tham khảo 7 tầng OSI (7)
    • 1.2. Họ giao thức TCP/IP (10)
    • 1.3. So sánh giữa hai giao thức TCP và UDP (11)
    • 1.4. Cổng giao thức (12)
    • 1.5. Địa chỉ IP, các địa chỉ IP dành riêng (12)
    • 1.6. Địa chỉ tên miền: loại A, loại MX (0)
    • 1.7. Giao thức hiệu năng UDP(User Datagram Protocol) (14)
    • 1.8. Giao thức RTP (Real-time Transport Protocol) (15)
    • 1.9. Giao thức RTCP (Real-time Transport Control Protocol) (17)
  • CHƯƠNG 2: KIẾN THỨC CƠ BẢN VỀ LẬP TRÌNH C# (19)
    • 2.1. Ngôn ngữ C# (19)
    • 2.2. Lớp, đối tượng và kiểu (0)
    • 2.3. Phương thức (20)
    • 2.4. Các kiểu (21)
      • 2.4.1. Chọn một kiểu định sẵn (23)
    • 2.5. Biến và hằng (24)
      • 2.5.1. Khởi tạo trước khi dùng (24)
      • 2.5.2. Hằng (24)
      • 2.5.3. Kiểu liệt kê (24)
      • 2.5.4. Chuỗi (25)
      • 2.5.5. Định danh (25)
    • 2.6. Biểu thức (25)
    • 2.7. Câu lệnh (25)
      • 2.7.1. Các lệnh rẽ nhánh không điều kiện (26)
      • 2.7.3. Lệnh lặp (27)
    • 2.8. Toán tử (28)
      • 2.8.1. Toán tử gán (=) (28)
      • 2.8.2. Nhóm toán tử toán học (28)
      • 2.8.3. Các toán tử tăng và giảm (29)
      • 2.8.4. Các toán tử quan hệ (29)
      • 2.8.5 Các toán tử logic (29)
      • 2.8.6. Thứ tự các toán tử (29)
    • 2.9. Namespaces (30)
    • 2.10. Lớp và đối tượng (30)
      • 2.10.1. Định nghĩa lớp (30)
      • 2.10.2. Tạo đối tượng (31)
      • 2.10.3. Sử dụng các thành viên tĩnh (32)
      • 2.10.4. Truyền tham số (32)
    • 2.11. Kế thừa và Đa hình (33)
      • 2.11.1 Sự kế thừa (33)
      • 2.11.2. Đa hình (33)
    • 2.12. Cấu trúc (34)
    • 2.13. Windows Form (35)
    • 2.14. Truy cập dữ liệu (36)
  • CHƯƠNG 3: CHƯƠNG TRÌNH ỨNG DỤNG (38)
    • 3.1. Chức năng của chương trình (38)
      • 3.1.1. Chức năng dành cho giáo viên (38)
      • 3.1.2. Chức năng dành cho sinh viên (38)
    • 3.2. Thiết kế giao diện (39)
      • 3.2.1. Giao diện của giáo viên (39)
      • 3.2.2. Giao diện sinh viên (41)
    • 3.3. Thiết kế modul chương trình (42)
      • 3.3.1 Modul chương trình giáo viên (42)
    • 3.4. Giao diện chương trình thực nghiệm (45)
      • 3.4.1. giao diện giáo viên (45)
      • 3.4.2. Giao diện bài học của sinh viên (47)
      • 3.2.2. Giao diện sinh viên khi tham gia bài giảng (48)
  • TÀI LIỆU THAM KHẢO (50)

Nội dung

CÁC KIẾN THỨC CƠ BẢN VỀ MẠNG MÁY TÍNH

Mô hình tham khảo 7 tầng OSI

Mô hình kết nối hệ thống mở (OSI) do Tổ chức quốc tế về tiêu chuẩn hoá ISO đề xuất, cung cấp một khuôn khổ chuẩn cho các nhà sản xuất và cung cấp sản phẩm viễn thông Mục tiêu của mô hình này là hỗ trợ việc kết nối giữa các hệ thống và modun hoá các thành phần trong mạng viễn thông, từ đó giúp phát triển các sản phẩm viễn thông một cách hiệu quả.

- Cung cấp kiến thức về hoạt động của kết nối liên mạng

Để thiết lập và thực hiện một giao thức kết nối các thiết bị trên mạng, cần tuân theo trình tự công việc rõ ràng Mô hình OSI mang lại nhiều lợi ích, bao gồm việc chuẩn hóa giao tiếp giữa các hệ thống khác nhau và cải thiện khả năng tương tác của các thiết bị mạng.

Chia nhỏ các hoạt động phức tạp của mạng thành những phần công việc đơn giản giúp tối ưu hóa quy trình Điều này cho phép các nhà thiết kế phát triển và cải tiến từng mô-đun chức năng một cách hiệu quả hơn.

Cung cấp khả năng định nghĩa các chuẩn giao tiếp tương thích cao với tính năng "plug and play", đồng thời tích hợp sản phẩm từ nhiều nhà cung cấp khác nhau Mô hình OSI đóng vai trò quan trọng trong việc cấu trúc và quản lý các giao thức mạng.

Mô hình OSI gồm 7 lớp (level), mỗi lớp thực hiện các chức năng riêng cho hoạt động kết nối mạng

Bảy lớp OSI được mô tả trong hình 1-1, trong đó bốn lớp đầu tiên xác định cách thức thiết lập kết nối giữa các đầu cuối để trao đổi dữ liệu, trong khi ba lớp trên hỗ trợ phát triển các ứng dụng giúp các đầu cuối và người dùng kết nối với nhau.

Ba lớp trên cùng của mô hình OSI được gọi là các lớp ứng dụng, hay còn gọi là các lớp cao Những lớp này chủ yếu liên quan đến giao tiếp với người dùng, định dạng dữ liệu và cách thức truy cập các ứng dụng.

Hình 1-2 Mô tả các lớp trên và cung cấp thông tin với các chức năng của nó qua ví dụ sau:

Lớp ứng dụng là lớp cao nhất trong mô hình mạng, nơi người dùng tương tác và kết nối các chương trình ứng dụng với các quy trình cho phép truy cập vào mạng.

Lớp presentation đóng vai trò quan trọng trong việc chuyển đổi dữ liệu từ lớp ứng dụng, đảm bảo rằng thông tin có thể được đọc và hiển thị trên các hệ thống khác nhau Chức năng của lớp này bao gồm mã hóa dữ liệu, như mã hóa hình ảnh JPEG và GIF, giúp hiển thị nội dung trên trang web một cách hiệu quả.

Lớp phiên (Session layer) có nhiệm vụ thiết lập, duy trì và kết thúc các phiên làm việc giữa các lớp trình bày Trong quá trình này, lớp phiên thực hiện việc trao đổi thông tin thông qua các yêu cầu dịch vụ và phản hồi từ các ứng dụng trên các thiết bị khác nhau.

Bốn lớp dưới của mô hình OSI định nghĩa cách dữ liệu được truyền qua các kết nối vật lý và thiết bị mạng, cuối cùng đến trạm đầu cuối và các lớp ứng dụng Trong cuốn sách này, chúng ta sẽ chỉ tập trung vào vấn đề này.

4 lớp cuối Và sẽ xem xét từng lớp một cách chi tiết giao thiếp giữa các lớp trong mô hình OSI:

Phương pháp protocol stack được sử dụng để kết nối hai thiết bị trong mạng, với protocol stack là tập hợp các quy định xác định cách dữ liệu được truyền qua mạng Ví dụ, trong TCP/IP, mỗi lớp cho phép dữ liệu di chuyển, và các lớp này trao đổi thông tin để thiết lập liên lạc giữa hai thiết bị Giao tiếp giữa các lớp diễn ra thông qua Protocol Data Unit (PDU), trong đó thông tin điều khiển được thêm vào dữ liệu ở lớp trên và được lưu trữ trong các trường header và trailer.

Họ giao thức TCP/IP

Các tầng của giao thức TCP/IP so với cấc tầng của mô hình OSI

Application: Xác nhận quyền, nén dữ liệu và các dịch vụ cho người dùng

Transport: Xử lý dữ liệu giữa các hệ thống va cung cấp việc truy cập mạng cho các ứng dụng

Network: Tìm đường cho các packet

Link: Mức OS hoặc các thiết bị giao tiếp mạng trên một máy tính

Một số điểm khác nhau của TCP/IP và mô hình OSI

Lớp ứng dụng trong TCP/IP đảm nhận các chức năng của lớp 5, 6, và 7 trong mô hình OSI, trong khi lớp transport trong TCP/IP cung cấp cơ chế UDP với khả năng truyền không tin cậy Ngược lại, lớp transport trong mô hình OSI luôn đảm bảo việc truyền tin cậy.

+ TCP/IP là một tập của các protocols (một bộ giao thức)

+ TCP/IP xây dựng trước OSI

Quy trình đóng gói dữ liệu trong mô hình TCP/IP như sau:

So sánh giữa hai giao thức TCP và UDP

Tầng giao vận: Dịch vụ TCP

Truyền tin cậy o Giữa tiến trình Gửi và tiến trình Nhận o Hai bên phải thiết lập trước kết nối:

Dịch vụ hướng kết nối Điều khiển lưu lượng o Bên gửi không gửi quá nhiều

Kiểm soát tắc nghẽn o Giảm tốc độ gửi khi mạng quá tải

Không cung cấp o Đảm bảo về thời gian và băng thông

Cổng giao thức

Là một số năm trong khoảng 1 65535 dùng để phân biệt giữa 2 ứng dụng mạng với nhau gắn với địa chỉ IP và Socket

Một số cổng và các giao thức thông dụng:

Địa chỉ IP, các địa chỉ IP dành riêng

1.6 Địa chỉ tên miền: loại A, loại MX

(vi dụ foo.com) o Value: Địa chỉ

IP của authoritative name server ứng với miền đó

Type = CNAME o Name: Tên bí danh cho một tên thưc nào đó: vi dụ www.ibm.com la tên bí danh của

Servereast.backup2.ibm.com Value: Tên thực

Type = MX o Value: Tên của mailserver

1.7 Giao thức hiệu năng UDP(User Datagram Protocol)

UDP là giao thức không liên kết, cung cấp dịch vụ giao vận không tin cậy, thường được sử dụng thay thế cho TCP trong tầng giao vận Khác với TCP, UDP không thiết lập hay giải phóng liên kết, không có cơ chế báo nhận (ACK), và không sắp xếp tuần tự các đơn vị dữ liệu (datagram), điều này có thể dẫn đến tình trạng mất hoặc trùng dữ liệu mà không có thông báo cho người gửi Khuôn dạng của UDP datagram được mô tả như sau:

- Số hiệu cổng nguồn (Source Port -16 bit): số hiệu cổng nơi đã gửi datagram

- Số hiệu cổng đích (Destination Port – 16 bit): số hiệu cổng nơi datagram đã chuyển tới

- Độ dài UDP (Length – 16 bit): độ dài tổng cộng kể cả phần header của UDP datagram

UDP Checksum (16 bit) là một cơ chế kiểm soát lỗi trong giao thức UDP Khi phát hiện lỗi trong UDP datagram, gói tin sẽ bị loại bỏ mà không có thông báo nào được gửi lại cho trạm gửi.

UDP sử dụng cơ chế gán và quản lý số hiệu cổng để xác định duy nhất, giúp nó hoạt động nhanh hơn TCP Phương thức này thường được áp dụng cho các ứng dụng không yêu cầu độ tin cậy cao trong quá trình truyền tải dữ liệu.

1.8 Giao thức RTP (Real-time Transport Protocol) :

Giao thức Truyền Thời Gian Thực (RTP) là chuẩn Internet dùng để truyền tải thông tin giữa các thành phần tương tác trên mạng, cung cấp dịch vụ dữ liệu thời gian thực như video và audio RTP thường hoạt động trên nền tảng UDP để tận dụng khả năng multiplexing và kiểm lỗi Nó hỗ trợ truyền dữ liệu đến nhiều địa chỉ đích thông qua cơ chế multicast, nếu hệ thống mạng cho phép RTP được thiết kế chủ yếu cho việc truyền đa đối tượng, nhưng vẫn có thể sử dụng cho truyền tải một đối tượng Giao thức này có khả năng truyền tải một chiều, như dịch vụ video theo yêu cầu, cũng như các dịch vụ trao đổi qua lại như điện thoại Internet.

Hoạt động của RTP được củng cố bởi RCTP, thủ tục này giúp thu thập thông tin phản hồi về chất lượng truyền dẫn và các thành phần tham gia trong các phiên hiện tại.

Hoạt động của giao thức

RTP không cung cấp cơ chế đảm bảo truyền theo thời gian hay các kỹ thuật QoS, mà phụ thuộc vào các dịch vụ ở lớp dưới để thực hiện những khả năng này Nó cũng không đảm bảo an toàn hay thứ tự của các packet khi truyền, tuy nhiên số thứ tự trong RTP packet cho phép bên nhận sắp xếp lại các packet theo thứ tự gửi Thêm vào đó, số thứ tự này có thể được sử dụng để xác định vị trí thích hợp của một packet, như trong việc giải mã video, mà không cần phải giải mã các packet theo thứ tự.

Các gói tin truyền qua Internet thường gặp phải tình trạng trễ và jitter không thể đoán trước Tuy nhiên, các ứng dụng đa phương tiện cần thời gian truyền và phát lại dữ liệu chính xác Giao thức RTP cung cấp các cơ chế đảm bảo thời gian, thứ tự và các yếu tố liên quan khác, giúp truyền tải dữ liệu thời gian thực giữa các đầu cuối qua mạng một cách hiệu quả.

Tem thời gian (time-stamping) là yếu tố quan trọng nhất trong các ứng dụng thời gian thực, giúp người gửi thiết lập “tem thời gian” ngay tại thời điểm octet đầu tiên của gói dữ liệu Những “tem thời gian” này tăng dần theo thời gian cho mọi gói Khi bên thu nhận được gói dữ liệu, họ sử dụng các “tem thời gian” để khôi phục thời gian gốc, từ đó chạy dữ liệu với tốc độ phù hợp.

RTP được sử dụng để đồng bộ hóa các dòng dữ liệu khác nhau, như hình ảnh và âm thanh, nhưng việc đồng bộ này do các ứng dụng phía trên thực hiện Bộ phận nhận dạng tải xác định định dạng, mã hóa và nén của tải tin, giúp các ứng dụng phía thu phân tích và xử lý dữ liệu Trong quá trình truyền tin, các bộ phát RTP chỉ có thể gửi một dạng tải tin tại một thời điểm, mặc dù có thể thay đổi để thích ứng với tình trạng mạng Một chức năng quan trọng khác của RTP là xác định nguồn, cho phép các ứng dụng thu biết dữ liệu đến từ đâu, như trong trường hợp hội nghị thoại, người dùng có thể nhận diện ai đang nói dựa trên thông tin nhận dạng nguồn.

Hình 3-7: Mã hoá gói tin RTP trong gói IP

Các cơ chế trên được thực hiện thông qua mào đầu của RTP Cách mã hoá gói tin RTP trong gói tin IP được mô tả trên hình vẽ

RTP nằm ở phía trên UDP, sử dụng các chức năng ghép kênh và kiểm tra của UDP

UDP và TCP là hai giao thức chính trên Internet, trong đó TCP cung cấp kết nối định hướng với độ tin cậy cao, còn UDP mang lại dịch vụ không liên kết và độ tin cậy thấp UDP được ưa chuộng làm phương thức truyền tải cho RTP vì hai lý do chính.

RTP được thiết kế chủ yếu để truyền tải thông tin đa đối tượng, trong khi các kết nối có định hướng và có báo nhận không đáp ứng hiệu quả cho mục đích này.

Trong xử lý dữ liệu thời gian thực, việc truyền tải đúng thời gian quan trọng hơn độ tin cậy Cơ chế báo phát lại của TCP không phù hợp với RTP, vì khi mạng bị tắc nghẽn, một số gói có thể bị mất mà chất lượng dịch vụ vẫn có thể chấp nhận được Nếu thực hiện phát lại, sẽ gây ra độ trễ lớn và làm trầm trọng thêm tình trạng tắc nghẽn mạng.

RTP chủ yếu được áp dụng trong các ứng dụng có cơ chế khôi phục gói bị mất và kiểm soát tắc nghẽn.

1.9 Giao thức RTCP (Real-time Transport Control Protocol):

RTCP (Giao thức Kiểm soát Truyền Tải Thời gian Thực) là giao thức hỗ trợ cho RTP, cung cấp thông tin phản hồi về chất lượng truyền dữ liệu Các dịch vụ mà RTCP cung cấp bao gồm việc theo dõi và đánh giá chất lượng dịch vụ truyền tải, giúp cải thiện hiệu suất của các ứng dụng truyền thông thời gian thực.

Giám sát chất lượng và điều khiển tắc nghẽn là chức năng cơ bản của RTCP, cung cấp thông tin phản hồi về chất lượng phân phối dữ liệu cho các ứng dụng Thông tin này rất hữu ích cho bộ phát, bộ thu và quản lý mạng Bộ phát có khả năng điều chỉnh cách thức truyền dữ liệu dựa trên phản hồi từ bộ thu, trong khi bộ thu có thể xác định tắc nghẽn ở mức độ cục bộ, từng phần hoặc toàn bộ Qua đó, người quản lý mạng có thể đánh giá hiệu suất mạng một cách hiệu quả.

Giao thức hiệu năng UDP(User Datagram Protocol)

UDP là giao thức không liên kết, cung cấp dịch vụ giao vận không tin cậy, thường được sử dụng thay thế cho TCP trong tầng giao vận Khác với TCP, UDP không thiết lập hay giải phóng liên kết, không có cơ chế báo nhận (ACK), và không sắp xếp tuần tự các datagram Điều này có thể dẫn đến tình trạng mất mát hoặc trùng lặp dữ liệu mà không có thông báo cho người gửi Khuôn dạng của UDP datagram được mô tả như sau:

- Số hiệu cổng nguồn (Source Port -16 bit): số hiệu cổng nơi đã gửi datagram

- Số hiệu cổng đích (Destination Port – 16 bit): số hiệu cổng nơi datagram đã chuyển tới

- Độ dài UDP (Length – 16 bit): độ dài tổng cộng kể cả phần header của UDP datagram

UDP Checksum (16 bit) được sử dụng để kiểm soát lỗi trong quá trình truyền dữ liệu Khi phát hiện lỗi, UDP datagram sẽ bị loại bỏ mà không có thông báo nào được gửi lại cho trạm gửi.

UDP sử dụng chế độ gán và quản lý số hiệu cổng (port number) để xác định duy nhất, giúp nó hoạt động nhanh hơn TCP Giao thức này thường được áp dụng cho các ứng dụng không yêu cầu độ tin cậy cao trong quá trình truyền tải dữ liệu.

Giao thức RTP (Real-time Transport Protocol)

Giao thức truyền thời gian thực (RTP) là chuẩn Internet cho việc truyền tải các luồng thông tin giữa các thành phần tương tác trên mạng, cung cấp dịch vụ dữ liệu thời gian thực như video và audio RTP thường sử dụng UDP để tối ưu khả năng multiplexing và kiểm lỗi, đồng thời hỗ trợ truyền dữ liệu đến nhiều địa chỉ đích thông qua cơ chế multicast nếu hệ thống mạng cho phép RTP được thiết kế chủ yếu cho việc truyền đa đối tượng nhưng cũng có thể phục vụ cho một đối tượng duy nhất Giao thức này cung cấp các dịch vụ như khôi phục thời gian, phát hiện lỗi, bảo mật và xác định nội dung, cho phép truyền tải một chiều như video theo yêu cầu hoặc dịch vụ trao đổi qua lại như điện thoại Internet.

Hoạt động của RTP được hỗ trợ bởi quy trình RCTP, giúp thu thập thông tin phản hồi về chất lượng truyền dẫn và thành phần tham gia các phiên hiện tại.

Hoạt động của giao thức

RTP không cung cấp cơ chế đảm bảo thời gian truyền hay các kỹ thuật QoS, mà phụ thuộc vào các dịch vụ ở lớp dưới RTP cũng không đảm bảo tính an toàn hay thứ tự của các gói tin trong quá trình truyền Tuy nhiên, số thứ tự trong gói RTP cho phép bên nhận sắp xếp lại các gói tin theo thứ tự gửi Thêm vào đó, số thứ tự này có thể được sử dụng để xác định vị trí thích hợp của một gói tin, như trong việc giải mã video, mà không cần phải giải mã các gói tin theo thứ tự.

Các gói tin trên Internet thường gặp phải tình trạng trễ và jitter không thể dự đoán Tuy nhiên, các ứng dụng đa phương tiện cần thời gian truyền tải và phát lại dữ liệu ổn định Giao thức RTP (Real-time Transport Protocol) cung cấp các cơ chế đảm bảo thời gian và thứ tự truyền tải, giúp truyền dữ liệu thời gian thực giữa các đầu cuối qua mạng một cách hiệu quả.

Tem thời gian là thành phần quan trọng trong các ứng dụng thời gian thực, được thiết lập bởi người gửi ngay khi octet đầu tiên của gói được lấy mẫu Các tem thời gian này tăng dần theo thời gian cho mọi gói dữ liệu Khi bên thu nhận được gói, họ sử dụng các tem thời gian để khôi phục thời gian gốc, từ đó chạy dữ liệu với tốc độ phù hợp.

RTP được sử dụng để đồng bộ hóa các dòng dữ liệu khác nhau, như giữa hình ảnh và âm thanh, nhưng không thực hiện đồng bộ mà các ứng dụng phía trên sẽ xử lý Bộ phận nhận dạng tải xác định kiểu định dạng của tải tin, cũng như các phương pháp mã hóa và nén, giúp các ứng dụng phía thu phân tích và xử lý dữ liệu Trong quá trình truyền tin, bộ phát RTP chỉ có thể gửi một dạng tải tin duy nhất, mặc dù có thể thay đổi để thích ứng với tắc nghẽn mạng Một chức năng quan trọng khác của RTP là xác định nguồn, cho phép ứng dụng thu biết được dữ liệu đến từ đâu, ví dụ trong hội nghị thoại, người dùng có thể nhận diện ai đang nói thông qua thông tin nhận dạng nguồn.

Hình 3-7: Mã hoá gói tin RTP trong gói IP

Các cơ chế trên được thực hiện thông qua mào đầu của RTP Cách mã hoá gói tin RTP trong gói tin IP được mô tả trên hình vẽ

RTP nằm ở phía trên UDP, sử dụng các chức năng ghép kênh và kiểm tra của UDP

UDP và TCP là hai giao thức chính trên Internet Trong khi TCP cung cấp kết nối định hướng và độ tin cậy cao, UDP lại mang đến dịch vụ không liên kết với độ tin cậy thấp hơn UDP được chọn làm phương thức truyền tải cho RTP nhờ vào hai lý do chính.

RTP được phát triển chủ yếu để hỗ trợ truyền tải dữ liệu đa đối tượng, trong khi các kết nối có định hướng và báo nhận không đáp ứng hiệu quả cho mục đích này.

Đối với dữ liệu thời gian thực, việc truyền tải đúng thời gian quan trọng hơn độ tin cậy Cơ chế báo phát lại trong TCP không phù hợp với RTP, vì khi mạng bị tắc nghẽn, một số gói có thể bị mất Mặc dù chất lượng dịch vụ có thể thấp, nhưng vẫn chấp nhận được Nếu thực hiện phát lại, sẽ gây ra độ trễ lớn và làm trầm trọng thêm tình trạng tắc nghẽn mạng.

RTP chủ yếu được áp dụng trong các ứng dụng có cơ chế khôi phục gói bị mất và điều khiển tắc nghẽn.

Giao thức RTCP (Real-time Transport Control Protocol)

RTCP (Giao thức Kiểm soát Truyền tải Thời gian Thực) hỗ trợ RTP bằng cách cung cấp thông tin phản hồi về chất lượng truyền dữ liệu Các dịch vụ mà RTCP cung cấp bao gồm việc theo dõi và đánh giá hiệu suất truyền tải, giúp cải thiện trải nghiệm người dùng trong các ứng dụng truyền thông thời gian thực.

Giám sát chất lượng và điều khiển tắc nghẽn là chức năng quan trọng của RTCP, cung cấp thông tin phản hồi về chất lượng phân phối dữ liệu cho các ứng dụng Thông tin này hỗ trợ bộ phát, bộ thu và giám sát trong việc điều chỉnh cách thức truyền dữ liệu dựa trên phản hồi nhận được Bộ thu có khả năng xác định tình trạng tắc nghẽn, cho phép người quản lý mạng đánh giá hiệu suất mạng một cách hiệu quả.

Trong các gói RTP, nguồn được xác định bằng các số ngẫu nhiên 32 bit, tuy nhiên, những số này không thân thiện với người dùng RTCP cung cấp thông tin nhận dạng nguồn rõ ràng hơn dưới dạng văn bản, giúp người dùng dễ dàng nhận diện.

Nó có thể bao gồm tên người sử dụng, số điện thoại, địa chỉ e-mail và các thông tin khác

Đồng bộ môi trường là quá trình quan trọng trong việc kết hợp âm thanh và hình ảnh Các thông báo từ bộ phát RTCP cung cấp thông tin cần thiết để xác định thời gian và nhãn thời gian RTP, giúp đảm bảo sự đồng bộ chính xác giữa âm thanh và hình ảnh.

Để điều chỉnh thông tin điều khiển trong các gói RTCP, việc gửi thông tin này theo chu kỳ giữa những người tham dự là rất quan trọng Khi số lượng người tham dự tăng, cần phải cân bằng giữa việc nhận thông tin điều khiển mới nhất và việc hạn chế lưu lượng điều khiển Để hỗ trợ nhóm người dùng lớn, RTCP phải hạn chế lưu lượng điều khiển từ các tài nguyên mạng khác, trong khi RTP chỉ cho phép tối đa 5% lưu lượng cho điều khiển toàn bộ phiên làm việc Việc điều chỉnh tốc độ phát của RTCP theo số lượng người tham dự là cách thực hiện hiệu quả nhất.

KIẾN THỨC CƠ BẢN VỀ LẬP TRÌNH C#

Ngôn ngữ C#

C# là một ngôn ngữ lập trình đơn giản với khoảng 80 từ khóa và hơn mười kiểu dữ liệu tích hợp sẵn, mang lại tính diễn đạt cao Ngôn ngữ này hỗ trợ các phương pháp lập trình cấu trúc, hướng đối tượng và hướng thành phần.

Ngôn ngữ lập trình hướng đối tượng chủ yếu tập trung vào lớp, cho phép định nghĩa kiểu dữ liệu mới và mở rộng khả năng của ngôn ngữ C# cung cấp các từ khoá để khai báo lớp, phương thức và thuộc tính, đồng thời hỗ trợ đầy đủ các khái niệm cơ bản như đóng gói, thừa kế và đa hình trong lập trình hướng đối tượng.

C# hỗ trợ khái niệm giao diện (interfaces) tương tự như Java, cho phép một lớp chỉ kế thừa một lớp cha nhưng có thể thực thi nhiều giao diện khác nhau.

C# có kiểu cấu trúc (struct), khác với C++ Cấu trúc là kiểu dữ liệu nhẹ hơn và có những hạn chế nhất định Nó không hỗ trợ kế thừa lớp, nhưng có khả năng thực thi các giao diện.

C# hỗ trợ lập trình hướng thành phần với các đặc trưng như thuộc tính, sự kiện và dẫn hướng khai báo (attribute) Lập trình hướng component được CLR hỗ trợ thông qua siêu dữ liệu (metadata), mô tả các lớp, bao gồm phương thức, thuộc tính và thông tin bảo mật.

Assembly trong lập trình là tập hợp các tập tin, bao gồm thư viện liên kết động (DLL) và tập tin thực thi (EXE) Trong môi trường NET, assembly đóng vai trò là đơn vị tái sử dụng, xác định phiên bản, bảo mật và phân phối Hệ thống CLR cung cấp nhiều lớp để thao tác với assembly, hỗ trợ lập trình viên trong quá trình phát triển ứng dụng.

C# cho phép truy cập trực tiếp vào bộ nhớ thông qua con trỏ kiểu C++, nhưng việc này được coi là không an toàn Hệ thống CLR sẽ không tự động thu dọn rác các đối tượng mà con trỏ tham chiếu cho đến khi lập trình viên tự giải phóng chúng.

2.2 Lớp, đối tƣợng và kiểu

Lập trình hướng đối tượng chủ yếu tập trung vào việc tạo ra các kiểu mới, với mỗi kiểu đại diện cho một "điều" cụ thể Điều này có thể là những khái niệm trừu tượng như bảng dữ liệu hay chuỗi, hoặc những đối tượng cụ thể như nút trong cửa sổ Windows Mỗi kiểu định nghĩa các thuộc tính chung và cách thức hoạt động của "điều" đó, giúp tổ chức và quản lý mã nguồn một cách hiệu quả.

Trong C#, giống như các ngôn ngữ lập trình hướng đối tượng khác, kiểu dữ liệu được định nghĩa bằng từ khóa "class" (lớp), và các thể hiện của lớp này được gọi là "đối tượng" (object).

Các hành vi của lớp được gọi là phương thức thành viên, hay còn gọi là phương thức Một phương thức thực chất là một hàm, và nó định nghĩa các chức năng mà lớp đó có thể thực hiện.

Trong lập trình C#, phương thức Main() đóng vai trò quan trọng như là phương thức chính đầu tiên được gọi bởi CLR khi chương trình bắt đầu Khác với các phương thức khác như WriteLine() hay AddNumbers(), Main() không diễn tả một hành động cụ thể nhưng là bắt buộc có mặt trong mọi chương trình C#.

Khai báo phương thức là mối liên hệ giữa người tạo ra và người sử dụng phương thức, thường là giữa các lập trình viên trong một đội phát triển Để khai báo một phương thức, cần chỉ định giá trị trả về, có thể có hoặc không có tham số truyền vào Giá trị trả về cho biết kiểu dữ liệu mà phương thức sẽ trả lại sau khi thực thi Một số phương thức không trả về giá trị cụ thể, được gọi là kiểu void và khai báo bằng từ khóa void Trong C#, mỗi phương thức phải trả về một kiểu giá trị cụ thể hoặc kiểu void.

C# yêu cầu khai báo kiểu dữ liệu của đối tượng khi tạo, giúp trình biên dịch kiểm tra tính hợp lệ của dữ liệu gán cho đối tượng và phân bổ bộ nhớ đúng kích thước.

C# phân thành hai loại: loai dữ liệu dựng sẵn (intrinsic (built-in)) và loại do người dùng định nghĩa (user-defined)

C# phân chia các kiểu dữ liệu thành hai loại chính: kiểu giá trị và kiểu tham chiếu Biến kiểu giá trị được lưu trữ trong vùng nhớ stack, trong khi biến kiểu tham chiếu được lưu trong vùng nhớ heap.

C# hỗ trợ kiểu con trỏ giống như C++, nhưng việc sử dụng chúng khá hiếm Thông thường, con trỏ chỉ được áp dụng khi tương tác trực tiếp với Win API hoặc các đối tượng COM.

Phương thức

Các hành vi của một lớp được gọi là phương thức thành viên, hay còn gọi là phương thức Một phương thức thực chất là một hàm, và nó định nghĩa các chức năng mà lớp đó có thể thực hiện.

Trong lập trình C#, phương thức thường được đặt tên theo hành động như WriteLine() hoặc AddNumbers() Tuy nhiên, có một phương thức đặc biệt mang tên Main(), không diễn tả hành động nhưng được chỉ định rõ với CLR là phương thức chính đầu tiên của lớp Khi chương trình bắt đầu, CLR sẽ gọi hàm Main() đầu tiên, và mọi chương trình C# đều phải có hàm Main() này.

Khai báo phương thức là mối liên hệ giữa người tạo ra và người sử dụng phương thức, thường do một thành viên trong đội phát triển tạo ra và lập trình viên khác sử dụng Để khai báo phương thức, cần chỉ định giá trị trả về, có thể có hoặc không có tham số Giá trị trả về cho biết kiểu dữ liệu mà phương thức sẽ trả lại sau khi thực thi Một số phương thức không trả về giá trị cụ thể, được gọi là kiểu void và sử dụng từ khóa void Trong C#, mỗi phương thức phải trả về một kiểu giá trị cụ thể hoặc kiểu void.

Các kiểu

C# yêu cầu khai báo kiểu của đối tượng được tạo, giúp trình biên dịch kiểm tra tính hợp lệ của dữ liệu gán cho đối tượng và cấp phát bộ nhớ đúng kích thước.

C# phân thành hai loại: loai dữ liệu dựng sẵn (intrinsic (built-in)) và loại do người dùng định nghĩa (user-defined)

C# phân loại kiểu dữ liệu thành hai loại chính: kiểu giá trị và kiểu tham chiếu Biến kiểu giá trị được lưu trữ trong bộ nhớ stack, trong khi biến kiểu tham chiếu được lưu trong bộ nhớ heap.

C# hỗ trợ kiểu con trỏ giống như C++, nhưng việc sử dụng chúng khá hiếm Thông thường, con trỏ chỉ được áp dụng khi làm việc trực tiếp với Win API hoặc các đối tượng COM.

C# cung cấp nhiều kiểu dữ liệu định sẵn, mỗi kiểu này ánh xạ đến một kiểu được hỗ trợ bởi CLS (Common Language Specification) Việc ánh xạ này đảm bảo rằng các đối tượng được tạo ra trong C# tương thích với các đối tượng được tạo ra trong các ngôn ngữ khác của NET Mỗi kiểu dữ liệu có kích thước cố định, được liệt kê trong bảng dưới đây.

(byte) Kiểu Net Mô tả - Giá trị

Char 1 Char Mã ký tự Unicode

Bool 1 Boolean True hay False

Int 4 Int 32 Không có dấu ( 0…4294967295)

Uint 4 Uint 32 Số thực (≈ ± 1.5*10-45 ≈ ±3.4*1038) Float 4 Single Số thực (≈ ±5.0*10324 ≈ ±1.7*10308) Double 8 Double Số có dấu chấm tĩnh với 28 ký số và dấu chấm Decimal 8 Decimal Số nguyên có dấu( -9223372036854775808

Long 8 Int 64 Số nguyên không dấu (0 0xfffffffffffffff)

2.4.1 Chọn một kiểu định sẵn

Khi lưu trữ dữ liệu, việc chọn kiểu dữ liệu phù hợp với giá trị cần lưu trữ là rất quan trọng Nếu kiểu dữ liệu quá lớn so với giá trị, chương trình sẽ tiêu tốn nhiều bộ nhớ và hoạt động chậm Ngược lại, nếu giá trị cần lưu lớn hơn kiểu dữ liệu thực tế, biến sẽ bị sai và kết quả chương trình cũng sẽ không chính xác.

Kiểu char đại diện cho một ký tự Unicode, ví dụ như “\u0041” tương ứng với ký tự “A” trong bảng Unicode Nhiều ký tự đặc biệt được biểu diễn bằng cách sử dụng dấu “\” trước ký tự tương ứng.

Các ký tự đặc biệt thông dụng:

Một đối tượng có thể chuyển đổi kiểu dữ liệu theo hai hình thức: ngầm định và tường minh Chuyển đổi ngầm định diễn ra tự động, trong khi chuyển đổi tường minh yêu cầu sự can thiệp trực tiếp từ lập trình viên Ví dụ, khi khai báo `short x = 5;` và `int y;`, ta có thể thực hiện chuyển kiểu ngầm định với `y = x;` Tuy nhiên, khi cố gắng thực hiện `x = y;`, sẽ xảy ra lỗi biên dịch Để thực hiện chuyển đổi thành công, cần sử dụng cú pháp tường minh như `x = (short) y;`.

Biến và hằng

Biến dùng để lưu trữ dữ liệu Mỗi biến thuộc về một kiểu dữ liệu nào đó

2.5.1 Khởi tạo trước khi dùng

Trong C#, biến phải được khởi tạo trước khi sử dụng; nếu không, trình biên dịch sẽ báo lỗi Bạn có thể khai báo biến trước và sau đó khởi gán giá trị, hoặc thực hiện cả hai trong cùng một bước Ví dụ: khai báo biến `int x;` sau đó khởi gán `x = 5;`, hoặc khai báo và khởi gán cùng lúc với `int y = x;`.

Hằng là một loại dữ liệu có giá trị không thay đổi trong suốt quá trình thực thi chương trình Để thao tác với giá trị cố định, ta sử dụng hằng, được khai báo tương tự như biến nhưng có thêm từ khóa const Một khi hằng đã được khởi tạo, giá trị của nó sẽ không thể thay đổi Ví dụ: const int HANG_SO = 100;

Enum là một phương pháp đặt tên cho các giá trị nguyên, tương tự như tập hợp các hằng, giúp chương trình trở nên rõ ràng và dễ hiểu hơn Enum không có hàm thành viên Ví dụ, để tạo một enum có tên là Ngay, bạn có thể định nghĩa như sau: enum Ngay {Hai, Ba, Tu, Nam, Sau, Bay, ChuNhat};

Theo cách khai báo này enum ngày có bảy giá trị nguyên đi từ 0 = Hai, 1

Mặc định, giá trị đầu tiên của enum là 0, và các giá trị tiếp theo sẽ tăng dần một đơn vị, tất cả đều thuộc kiểu int Để thay đổi giá trị mặc định này, bạn cần gán giá trị mong muốn cho các phần tử trong enum.

Cú pháp chung cho khai báo một kiểu enum như sau

[attributes] [modifiers] enum identifier [:base-type]

Chuỗi trong C# là một kiểu dữ liệu được dựng sẵn, bao gồm một chuỗi các ký tự đơn lẻ Để khai báo một biến chuỗi, chúng ta sử dụng từ khóa "string" Ví dụ, để khai báo một biến chuỗi lưu trữ giá trị "Hello World", ta viết: string myString = "Hello World";

2.5.5 Định danh Định danh là tên mà người lập trình chọn đại diện một kiểu, phương thức, biến, hằng, đối tượng… của họ Định danh phải bắt đầu bằng một ký tự hay dấu

“_” Định danh không được trùng với từ khoá C# và phân biệt hoa thường.

Biểu thức

Trong lập trình, bất kỳ câu lệnh nào định lượng giá trị đều được gọi là biểu thức Ví dụ, phép gán x = 32 cũng là một biểu thức vì nó xác định giá trị 32 được gán cho biến x.

Vì vậy phép gán trên có thể được gán một lần nữa như sau y = x = 32;

Sau lệnh này y có giá trị của biểu thức x = 32 và vì vậy y = 32.

Câu lệnh

Trong C++ và Java, một chỉ thị hoàn chỉnh được gọi là câu lệnh (statement) Chương trình bao gồm nhiều câu lệnh, và mỗi câu lệnh phải kết thúc bằng dấu “;”.

Ví dụ: int x; // là một câu lệnh x = 23; // một câu lệnh khác

Ngoài các câu lệnh bình thường như trên, có các câu lệnh khác là: lệnh rẽ nhánh không điều kiện, rẽ nhánh có điều kiện và lệnh lặp

2.7.1 Các lệnh rẽ nhánh không điều kiện

Có hai loại câu lệnh rẽ nhánh không điều kiện: lệnh gọi phương thức và lệnh điều kiện Khi trình biên dịch gặp lệnh gọi phương thức, nó sẽ tạm dừng phương thức hiện tại và chuyển đến phương thức được gọi Sau khi hoàn thành phương thức này, trình biên dịch sẽ quay trở lại phương thức trước đó.

Cách thứ hai để tạo các câu lệnh rẽ nhánh không điều kiện là sử dụng các từ khóa như goto, break, continue, return và throw, và các từ khóa này sẽ được giới thiệu chi tiết trong các phần tiếp theo.

2.7.2 Lệnh rẽ nhánh có điều kiện

Các từ khóa như if-else, while, do-while, for và switch-case được sử dụng để điều khiển dòng chảy của chương trình trong C# C# giữ lại hầu hết cú pháp của C++, với một số cải tiến trong lệnh switch Trong đó, lệnh if-else cho phép thực hiện các điều kiện khác nhau trong quá trình thực thi chương trình.

Cú pháp: if ( biểu thức logic ) khối lệnh; hoặc if ( biểu thức logic ) khối lệnh 1; else khối lệnh 2;

Ghi chú: Khối lệnh là một tập các câu lện trong cặp dấu “{…}” Bất kỳ nơi đâu có câu lệnh thì ở đó có thể viết bằng một khối lệnh

Biểu thức logic là biểu thức cho giá trị dúng hoặc sai (true hoặc false) Nếu

Trong lập trình, khi biểu thức logic trong câu lệnh if trả về giá trị đúng, khối lệnh 1 sẽ được thực thi; ngược lại, khối lệnh 2 sẽ được thực hiện Một điểm cần lưu ý là khác với C++, biểu thức trong câu lệnh if phải là biểu thức logic chứ không phải là biểu thức số Bên cạnh đó, lệnh switch cũng là một cấu trúc điều khiển quan trọng trong ngôn ngữ lập trình.

Cú pháp: switch ( biểu_thức_lựa_chọn )

{ case biểu_thức_hằng : khối lệnh; lệnh nhảy;

[ default : khối lệnh; lệnh nhảy; ]

Biểu thức lựa chọn trong câu lệnh switch là yếu tố quyết định giá trị nguyên hoặc chuỗi Câu lệnh switch sẽ so sánh biểu thức lựa chọn với các hằng số để xác định khối lệnh cần thực hiện Để thoát khỏi câu lệnh switch, các lệnh nhảy như break hay goto là bắt buộc phải có.

C# offers loop constructs similar to C++, including for, while, do-while, and the new foreach loop It also supports control statements such as goto, break, continue, and return.

Lệnh goto cho phép tạo ra lệnh nhảy trong chương trình, nhưng nhiều lập trình viên chuyên nghiệp khuyên không nên sử dụng nó vì có thể làm mất đi tính cấu trúc và sự rõ ràng của mã nguồn.

Cách dùng câu lệnh này như sau: (giống như trong C++)

2 goto đến nhãn đó b Vòng lặp while

Cú pháp: while ( biểu_thức_logic ) khối_lệnh;

Khối lệnh sẽ tiếp tục thực hiện cho đến khi biểu thức trở thành sai Nếu biểu thức sai ngay từ đầu, khối lệnh sẽ không được thực hiện Vòng lặp do … while cho phép thực hiện khối lệnh ít nhất một lần trước khi kiểm tra điều kiện.

Cú pháp: do khối_lệnh while ( biếu_thức_logic )

Khác với vòng lặp while, trong vòng lặp for, khối lệnh sẽ được thực hiện sau khi điều kiện được kiểm tra Nếu điều kiện đúng, khối lệnh sẽ tiếp tục được thực hiện.

Cú pháp: for ( [khởi_tạo_biến_đếm]; [biểu_thức]; [gia_tăng_biến_đếm] ) khối lệnh; e Câu lệnh break, continue, và return

Cả ba câu lệnh break, continue, và return rất quen thuộc trong C++ và Java, trong C#, ý nghĩa và cách sử dụng chúng hoàn toàn giống với hai ngôn ngữ này.

Toán tử

Các phép toán cơ bản như cộng (+), trừ (-), nhân (*) và chia (/) được gọi là toán tử Khi áp dụng các toán tử này lên các biến số, chúng ta thu được kết quả tương tự như các phép toán thông thường Ví dụ, với biến int a = 10 và int b = 20, phép toán c = a + b sẽ cho kết quả c = 30.

C# cung cấp cấp nhiều loại toán tử khác nhau để thao tác trên các kiểu biến dữ liệu, được liệt kê trong bảng sau theo từng nhóm ngữ nghĩa

Toán tử này cho phép thay đổi các giá trị của biến bên phải toán tử bằng giá trị bên trái toán tử

2.8.2 Nhóm toán tử toán học

C# sử dụng các toán tử số học như cộng (+), trừ (–), nhân (*) và chia (/), với ý nghĩa tương ứng theo tên gọi Kết quả trả về của các toán tử này phụ thuộc vào kiểu dữ liệu của hai toán hạng Bên cạnh đó, toán tử % (lấy phần dư) cũng được áp dụng cho các kiểu số nguyên.

2.8.3 Các toán tử tăng và giảm

C# kế thừa các toán tử từ C++ và Java như +=, -=, *=, /=, và %= để đơn giản hóa quá trình lập trình Ngoài ra, ngôn ngữ này cũng sử dụng các toán tử tiền tố và hậu tố (như biến++ và ++biến) nhằm giảm bớt sự phức tạp so với các toán tử truyền thống.

2.8.4 Các toán tử quan hệ

Toán tử quan hệ là công cụ dùng để so sánh hai giá trị và trả về kết quả dưới dạng Boolean Các toán tử này bao gồm: == (so sánh bằng), != (so sánh khác), > (so sánh lớn hơn), >= (lớn hơn hoặc bằng), < (so sánh nhỏ hơn), và Dịch trái, dịch phải

Quan hệ < > = is nhỏ hơn, lớn hơn, nhỏ hơn hay bằng, lớn hơn hay bằng và là

Logic trên bit AND & Và trên bit

OR | hoặc trên bit Điều kiện AND && Và trên biểu thức điều kiện Điều kiện OR || Hoặc trên biểu thức điều kiện Điều kiện ?: điều kiện tương tự if

Namespaces

Namespaces là phương pháp tổ chức mã nguồn thành các nhóm có ý nghĩa liên quan, cho phép bạn tạo ra một namespace riêng trong NET Framework hoặc từ các dịch vụ khác Để khai báo namespace, bạn sử dụng từ khóa "namespace" theo sau là tên của namespace mà bạn muốn tạo, và các đối tượng trong namespace được đặt trong dấu {}.

Lớp và đối tượng

Một lớp trong lập trình định nghĩa một tập hợp các đối tượng hoặc thể hiện của lớp đó Đối tượng là một thực thể có thể được tạo ra, lưu trữ và sử dụng, và trong C#, tất cả các biến đều được coi là đối tượng, bao gồm cả biến kiểu số và kiểu chuỗi Mỗi đối tượng có các biến thành viên để lưu trữ dữ liệu và các phương thức (hàm) để tác động lên các biến này Tất cả các đối tượng thuộc cùng một lớp sẽ có chung các biến thành viên và phương thức.

[attribute][bổ từ truy xuất] class định danh [:lớp cơ sở]

Bổ từ truy xuất xác định thành viên, hay còn gọi là biến thành viên và phương thức thành viên, được sử dụng để xác định thành viên nào của lớp được truy xuất từ lớp khác Có nhiều loại kiểu truy xuất khác nhau trong lập trình hướng đối tượng.

- public: Truy xuất mọi nơi

- protected: Truy xuất trong nội bộ lớp hoặc trong các lớp con

- internal: Truy xuất nội trong chương trình (assembly)

- protected internal: Truy xuất nội trong chương trình (assembly) và trong các lớp con

- private (mặc định): Chỉ được truy xuất trong nội bộ lớp b Các tham số của phương thức

Mỗi phương thức có thể không có tham số hoặc có nhiều tham số, và các tham số này được đặt sau tên phương thức trong cặp ngoặc đơn.

Constructor là phương thức đầu tiên được gọi khi khởi tạo đối tượng và chỉ được gọi một lần Chức năng của nó là thiết lập các tham số ban đầu cho đối tượng Tên của Constructor trùng với tên lớp, trong khi các đặc điểm khác giống như phương thức thông thường.

Nếu lớp không có hàm Constructor được định nghĩa, trình biên dịch sẽ tự động tạo ra một Constructor mặc định Trong trường hợp này, các biến thành viên sẽ được khởi tạo với các giá trị mặc định.

Kiểu Giá trị mặc định số (int, long, …) 0 bool false char „\0‟ (null) enum 0

Tham chiếu null b Khởi tạo

Chúng ta có thể khởi tạo giá trị cho các biến thành viên theo ý muốn thông qua constructor của lớp hoặc gán trực tiếp khi khai báo Với giá trị khởi tạo này, khi một đối tượng được tạo từ lớp, nó sẽ nhận giá trị ban đầu là các giá trị đã được khởi tạo, thay vì giá trị mặc định.

Hàm dựng sao chép (copy constructor) là một phương thức dùng để sao chép toàn bộ nội dung của các biến từ một đối tượng đã tồn tại sang một đối tượng mới được khởi tạo Từ khóa "this" trong hàm dựng sao chép thường được sử dụng để tham chiếu đến đối tượng hiện tại.

Từ khoá this được dùng để tham chiếu đến chính bản thân của đối tượng đó Ví dụ: public void SomeMethod (int hour)

2.10.3 Sử dụng các thành viên tĩnh

Ta có thể truy cập các thành viên static thông qua tên của lớp mà nó được khai báo trong đó a Cách gọi một thành viên tĩnh

Phương thức tĩnh (static) hoạt động trong lớp và không thể sử dụng từ khóa this Các phương thức static không thể truy cập trực tiếp vào các thành viên không static, mà cần thông qua đối tượng Ngoài ra, việc sử dụng Constructors tĩnh cũng là một khía cạnh quan trọng cần lưu ý.

Constructor tĩnh (static constructor) sẽ được chạy trước khi bất kỳ đối tượng nào tạo ra.Ví dụ: static Time( )

Khi dùng constructor tĩnh phải khá thận trọng vì nó có thể có kết quả khó lường c Constructor private

Khi muốn tạo một lớp mà không cho phép tạo bất kỷ một thể hiện nào của lớp thì ta dùng constructor private d Sử dụng các trường tĩnh

Cách dùng chung các biến thành viên tĩnh là giữ vết của một số các thể hiện mà hiện tại nó đang tồn tại trong lớp đó

C# cung cấp các tham số ref để h iệu chỉnh giá trị của những đối tượng bằng các tham chiếu a Truyền bằng tham chiếu

Một hàm chỉ có thể trả về một giá trị duy nhất Để nhận nhiều kết quả, ta sử dụng các tham số đầu ra, gọi là tham chiếu, để chứa các giá trị trả về từ hàm.

Trong C#, biến kiểu tham chiếu được truyền theo tham chiếu mặc định khi gọi hàm, trong khi biến kiểu giá trị cần sử dụng từ khóa ref để khai báo tham chiếu Đối với tham số đầu ra (out parameter), biến phải được khai báo nhưng không cần khởi tạo giá trị ban đầu; ví dụ, các biến theHour, theMinute, theSecond cần được khởi tạo giá trị 0 trước khi truyền cho hàm GetTime Sau khi gọi hàm, giá trị của các biến sẽ được cập nhật ngay lập tức, nhờ vào từ khóa out cho phép sử dụng tham số mà không cần khởi tạo trước.

Kế thừa và Đa hình

Kế thừa là phương pháp tạo ra lớp mới từ các lớp đã có, cho phép tái sử dụng mã nguồn hiệu quả Đa hình diễn ra khi lớp B kế thừa các đặc tính từ lớp A, đồng thời bổ sung thêm những cài đặt riêng biệt.

Trong C#, mối quan hệ chi tiết hoá là một hình thức kế thừa, trong đó lớp kế thừa (derived class) nhận các đặc tính và hành vi từ lớp cơ sở (base class) Ví dụ, khi nói rằng ListBox kế thừa từ Window, điều này có nghĩa là ListBox chi tiết hoá Window Lớp ListBox không chỉ tiếp nhận tất cả các thuộc tính của Window mà còn bổ sung thêm các thuộc tính và phương thức cần thiết cho riêng nó.

Trong C#, để tạo một lớp kế thừa, ta sử dụng dấu “:” theo sau tên lớp kế thừa và tên lớp cơ sở, ví dụ: public class ListBox : Window, có nghĩa là lớp ListBox kế thừa từ lớp Window.

Lớp kế thừa nhận được tất cả các phương thức và biến thành viên từ lớp cơ sở, bao gồm cả những thành viên mà lớp cơ sở đã thừa hưởng.

2.11.2 Đa hình Đa hình là việc lớp B thừa kế các đặc tính từ lớp A nhưng có thêm một số cài đặt riêng ListBox và Button đều là một Window, ta muốn có một form để giữ tập hợp tất cả các thể hiện của Window để khi một thể hiện nào được mở thì nó có thể bắt Window của nó vẽ lên Ngắn gọn, form này muốn quản lý mọi cư xử của tất cà các đối tượng đa hình của Window.Tạo phương thức đa hình, ta cần đặt từ khoá virtual trong phương thức của lớp cơ sở Ví dụ như: public virtual void DrawWindow( )

Trong lập trình hướng đối tượng, khi kế thừa, để ghi đè lại mã nguồn của lớp cơ sở, chúng ta sử dụng từ khóa "override" khi khai báo phương thức Nội dung bên trong phương thức được viết như bình thường.

Ví dụ về nạp chồng phương thức DrawWindow: public override void DrawWindow( )

{ base.DrawWindow( ); // gọi phương thức của lớp co sở

Console.WriteLine ("Writing string to the listbox: {0}", listBoxContents);

Dùng hình thức đa hình phương thức này thì tuỳ kiểu khai báo của đối tượng nào thì nó dùng phương thức của lớp đó

Khi cần ghi đè một phương thức trong lớp kế thừa mà không muốn nạp chồng phương thức virtual từ lớp cơ sở, ta sử dụng từ khóa new trước từ khóa virtual trong lớp kế thừa Ví dụ: public class ListBox : Window.

{ public new virtual void Sort( ) { }

Cấu trúc

Một cấu trúc (struct) là một kiểu do người dùng định nghĩa, nó tương tự như lớp như nhẹ hơn lớp Định nghĩa cấu trúc

[thuộc tính] [kiểu truy cập] struct [: ] {

// Các thành viên của cấu trúc

Cấu trúc trong lập trình không hỗ trợ kế thừa như lớp, mặc dù chúng đều ngầm định kế thừa từ object Điều này có nghĩa là cấu trúc không thể thừa kế từ bất kỳ lớp hay cấu trúc nào khác Hơn nữa, các cấu trúc cũng được xem là đã niêm phong, nhưng chúng cho phép cài đặt đa giao diện tương tự như lớp.

Cấu trúc trong lập trình không hỗ trợ hủy tử và không cho phép đặt tham số tùy ý cho hàm dựng Nếu không định nghĩa bất kỳ hàm dựng nào, cấu trúc sẽ tự động sử dụng hàm dựng mặc định, gán giá trị 0 cho tất cả các biến thành viên.

Cấu trúc được thiết kế nhẹ nhàng với các biến thành viên ở dạng private, giúp gói gọn dữ liệu Tùy thuộc vào tình huống và mục đích sử dụng, việc lựa chọn giữa lớp và cấu trúc là cần thiết.

Windows Form

Hầu hết mọi ứng dụng Windows Form mở rộng chức năng của

Lớp Form trong System.Windows.Forms cung cấp chức năng cơ bản để tạo cửa sổ tương tác trong môi trường Windows Bằng cách mở rộng lớp Form và thêm các control tùy biến cùng bộ điều khiển sự kiện, người dùng có thể phát triển ứng dụng hữu ích, cho phép tương tác với người dùng và dữ liệu thông qua giao diện người dùng tinh vi.

Các lớp thừa kế từ System.Windows.Forms:

System.Windows.Forms.Control là lớp cơ bản cho hầu hết các lớp trong namespace, cung cấp các chức năng thiết yếu cho việc xử lý bàn phím, nhập liệu từ chuột và quản lý tin nhắn của cửa sổ.

System.Windows.Forms.ButtonBase - Lớp này hỗ trợ chức năng cơ bản của một nút mà mọi lớp thừa hưởng sử dụng trong các cách khác nhau

Lớp System.Windows.Forms.TextBoxBase là lớp cơ sở cung cấp các chức năng và thuộc tính chung cho các lớp kế thừa Cả TextBox và RichTextBox đều sử dụng các tính năng mà TextBoxBase cung cấp.

Lớp System.Windows.Forms.ScrollableControl là một lớp cơ bản hỗ trợ cho các lớp kế thừa, giúp quản lý việc phát sinh và hiển thị các thanh cuộn, cho phép người dùng truy cập dễ dàng vào nội dung hiển thị.

System.Windows.Forms.ContainerControl - Lớp này quản lý chức năng yêu cầu cho một control để hành động như một sự chứa đựng những control khác

System.Windows.Forms.Panel - đây là control khác có thể chứa các control thêm vào, nhưng khác với lớp ContainerControl, nó phân loại các control một cách đơn giản

The System.Windows.Forms.Form class is responsible for creating and displaying various types of windows This versatile class can be utilized to generate standard windows, toolbox windows, borderless windows, modal dialog boxes, and multi-document interfaces.

System.Windows.Forms.UserControl là lớp cho phép người dùng tạo ra các điều khiển tùy chỉnh, có thể được sử dụng trong các ứng dụng phức tạp hoặc tổ chức.

Truy cập dữ liệu

Trong phần này chúng ta sẽ khảo sát sang trình cung cấp dữ liệu OLE DB

The NET Data Provider allows for connections to any database management system that supports OLE DB Providers, specifically Microsoft Access with the northwind.mdb database To establish this connection, the connection string used is: string connectionString = "provider=Microsoft.JET.OLEDB.4.0;".

Chuỗi trên sẽ kết nối đến cơ sở dữ liệu northwind trên ổ đĩa C

Kế tiếp ta là đối tượng OleDbDataAdapter

OleDbDataAdapter DataAdapter = new OleDbDataAdapter( commandString, connectionString);

Chúng ta phải đảm bảo là namespace OleDb được thêm vào ứng dụng : using System.Data.OleDb;

Sau đây sẽ trích ra một đoạn mã chính phục vụ cho việc kết nối theo cách này : public ADOForm1( )

// chuỗi kết nối đến cơ sở dữ liệu string connectionString = "provider=Microsoft.JET.OLEDB.4.0;"

// chuỗi truy vấn dữ liệu string commandString "Select CompanyName, ContactName from Customers";

// tạo đối tượng OleDbDataAdapter và DataSet mới

OleDbDataAdapter DataAdapter = new OleDbDataAdapter( commandString, connectionString);

// đẩy dữ liệu vào dataSet

// lây về bảng dữ liệu Customers

// duyệt qua từng dòng dữ liệu foreach (DataRow dataRow in dataTable.Rows)

{ lbCustomers.Items.Add(dataRow["CompanyName"] +

CHƯƠNG TRÌNH ỨNG DỤNG

Ngày đăng: 05/08/2021, 21:55

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w