Tcpip Server Asynchronous Socket Programming Lập Trình Mạng

33 43 1
Tcpip Server Asynchronous Socket Programming  Lập Trình Mạng

Đ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

Trong lập trình socket, sử dụng mô hình bất đồng bộ (asynchronous programming) có nhiều lợi ích. Đầu tiên, khi sử dụng mô hình bất đồng bộ, chương trình có thể tiếp tục thực hiện các tác vụ khác trong khi đang chờ đợi phản hồi từ socket, giúp tăng hiệu quả và thời gian đáp ứng của ứng dụng. Thứ hai, mô hình bất đồng bộ cho phép xử lý đồng thời nhiều kết nối cùng lúc, do đó giảm thời gian chờ đợi của người dùng và cải thiện trải nghiệm người dùng. Cuối cùng, mô hình bất đồng bộ cũng giúp giảm tải cho máy chủ khi nhiều yêu cầu đến cùng lúc, do đó tăng khả năng chịu tải của hệ thống. Vì những lý do này, mô hình bất đồng bộ đã trở thành một lựa chọn phổ biến trong lập trình socket và được sử dụng rộng rãi trong các ứng dụng mạng hiện đại.

Trường Đại học Công Thương TP.HCM Khoa Công nghệ thông tin BÁO CÁO MÔN HỌC LẬP TRÌNH MẠNG “TCPIP Server Asynchronous Socket Programming” Giảng viên hướng dẫn Nhóm thực hiện ThS Hồ Nhựt Minh 07 LẬP TRÌNH MẠNG ĐỀ TÀI 03 BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG THƯƠNG TP.HCM KHOA CÔNG NGHỆ THÔNG TIN  ĐỀ TÀI 3: TCPIP Server Asynchronous Socket Programming DANH SÁCH THÀNH VIÊN NHÓM 7 Họ và Tên MSSV Quách Vũ Thường 2033207469 Huỳnh Trần Đức Thắng 2033207466 Nguyễn Anh Tuấn 2033207472 Nguyễn Văn Linh 2033204745 Đoàn Đặng Anh Khoa 2033207506 GVHD: Ths Hồ Nhựt Minh Thành phố Hồ Chí Minh, tháng 03 năm 2023 LẬP TRÌNH MẠNG ĐỀ TÀI 03 Mục lục LỜI NÓI ĐẦU 1 PHẦN 1: CƠ SỞ LÝ THUYẾT 2 1.1 Lập trình đồng bộ (Synchronous Programming): 2 1.2 Lập trình bất đồng bộ: 2 1.3 So sánh lập trình đồng bộ và lập trình bất đồng bộ: 4 1.4 Lập trình bất đồng bộ trong C#.Net: 6 1.5 Lập trình bất đồng bộ mô hình TAP với từ khóa async và await trong C#.Net: 8 1.6 Lập trình Socket bất đồng bộ TCPIP Server với từ khóa async _await trong C#: 11 PHẦN 2: PHÂN TÍCH VIDEO: 03 TCPIP SERVER ASYNCHRONOUS SOCKET PROGRAMMING WITH ASYNC _ AWAIT KEYWORDS IN C# 13 2.1 Section Intro Asynchronous socket programming with async await in C# Net: 13 2.2 Example Disadvantage of synchronous IO in C# Net: 14 2.3 Accepting a TCPClient Connection Asynchronously with await keyword in C#: 17 2.4 Demo Accept TCPClient Asynchronously: 18 2.5 Continuously Accept Client Connections, Exception Handling in C# async Method: 20 2.6 Use System.Net.Socket.NetworkStream _ StreamReader to read data from client: 21 2.7 Demo Read Data On Network Stream and Endless Accept async in C#.Net: 23 2.8 How to Handle Multiple Network Clients on Server in C# Net: 24 2.9 Demo Send Data to Multiple Network Clients from List at Once, SendAll Method: 27 2.10 How to Stop Listening for New Connections and Disconnect Client Sockets Properly: 28 2.11 Demo TcpListener.Stop and TcpClient.Close Calls to Stop Server: 28 2.12 Section Summary TCPIP Server Side Asynchronous Socket Programming in C# Net: 29 TÀI LIỆU THAM KHẢO 30 NHÓM 07 i LẬP TRÌNH MẠNG ĐỀ TÀI 03 LỜI NÓI ĐẦU Trong lập trình socket, sử dụng mô hình bất đồng bộ (asynchronous programming) có nhiều lợi ích Đầu tiên, khi sử dụng mô hình bất đồng bộ, chương trình có thể tiếp tục thực hiện các tác vụ khác trong khi đang chờ đợi phản hồi từ socket, giúp tăng hiệu quả và thời gian đáp ứng của ứng dụng Thứ hai, mô hình bất đồng bộ cho phép xử lý đồng thời nhiều kết nối cùng lúc, do đó giảm thời gian chờ đợi của người dùng và cải thiện trải nghiệm người dùng Cuối cùng, mô hình bất đồng bộ cũng giúp giảm tải cho máy chủ khi nhiều yêu cầu đến cùng lúc, do đó tăng khả năng chịu tải của hệ thống Vì những lý do này, mô hình bất đồng bộ đã trở thành một lựa chọn phổ biến trong lập trình socket và được sử dụng rộng rãi trong các ứng dụng mạng hiện đại NHÓM 07 1 LẬP TRÌNH MẠNG ĐỀ TÀI 03 PHẦN 1: CƠ SỞ LÝ THUYẾT 1.1 Lập trình đồng bộ (Synchronous Programming): Lập trình đồng bộ (synchronous) là cách lập trình mà các hoạt động của chương trình sẽ được thực hiện tuần tự Trong mô hình lập trình quen thuộc của chúng ta, các công việc được thực hiện theo trật tự thời gian Công việc sắp xếp trước thực hiện xong mới đến lượt công việc tiếp theo Giả sử, có ba công việc được sắp xếp theo trình tự T1, T2, T3; thời gian thực hiện T1 là t1 giây, với T2 là t2 giây, T3 là t3 giây Khi nhiệm vụ T1 đã được bắt đầu thực hiện thì phải chờ T1 kết thúc, T2 mới được bắt đầu (sau t1 s) Một khi T2 bắt đầu thì phải chờ T2 kết thúc, T3 mới được bắt đầu (sau t1 + t2 s) Tổng thời gian thực hiện của cả ba nhiệm vụ là t1 + t2 + t3 s Mô hình lập trình theo đó các công việc bắt đầu và kết thúc theo đúng trình tự thời gian như trên được gọi là lập trình đồng bộ 1.2 Lập trình bất đồng bộ (asynchronous programming): Lập trình bất đồng bộ là cách lập trình cho phép các hoạt động thực hiện không theo tuần tự Có thể các đoạn code ở dưới chạy trước đoạn code viết ở phía trên (bất đồng bộ), các hoạt động không phải đợi lẫn nhau Bởi vì có nhiều threads nên khi xử lý các hoạt động có thời gian dài thì main thread (UI) vẫn có thể hoạt động do các thread là riêng biệt NHÓM 07 2 LẬP TRÌNH MẠNG ĐỀ TÀI 03 Giả sử (vẫn 3 nhiệm vụ T1, T2, T3 như trên) bây giờ chúng ta không chờ T1 kết thúc mà bắt đầu luôn T2 Ngay sau khi bắt đầu T2 chúng ta bắt đầu luôn T3 Trong mô hình này, nhiệm vụ sau không phải chờ nhiệm vụ trước kết thúc nữa Tổng thời gian thực hiện của ba nhiệm vụ không phải là t1+t2+t3 nữa mà nhỉnh hơn thời gian thực hiện nhiệm vụ dài nhất Rõ ràng mô hình này có lợi thế hơn về thời gian thực hiện Mô hình trong đó các nhiệm vụ không phải tuân thủ theo trình tự thời gian như trên được gọi là mô hình bất đồng bộ (asynchronous) Như vậy mô hình bất đồng bộ cũng cho phép thực hiện song song nhiều nhiệm vụ cùng lúc Trong lập trình socket, mô hình bất đồng bộ được sử dụng rất phổ biến ở cả client và server Đối với server , mô hình này cho phép xử lý đồng thời nhiều client và phát huy tốt khả năng xử lý song song của server Đối với client, nó giúp chương trình không bị treo giao diện khi thực hiện các nhiệm vụ kéo dài Trước khi Asynchronous programing ra đời ở những phiên bản cũ hơn của Net, chúng ta có công nghệ lập trình đa luồng (multiple thread) Đây là hai khái niệm và mô hình khác nhau, mặc dù cùng hướng tới mục tiêu tương tự Lập trình đa luồng là kỹ thuật cho phép chương trình thực hiện nhiều luồng (thread) cùng một lúc, mỗi luồng thực hiện một tác vụ riêng biệt Các luồng sẽ chia sẻ tài nguyên của chương trình như bộ nhớ, CPU, và các thiết bị nhập xuất Lập trình đa luồng được sử dụng để tăng tốc độ thực thi chương trình bằng cách sử dụng đồng thời nhiều CPU hoặc nhân của CPU để thực hiện các tác vụ đồng thời Trong khi đó, lập trình bất đồng bộ không phải là lập trình đa luồng Thay vì sử dụng nhiều luồng, lập trình bất đồng bộ cho phép các tác vụ đơn lẻ NHÓM 07 3 LẬP TRÌNH MẠNG ĐỀ TÀI 03 (single-threaded) thực hiện đồng thời và không chờ đợi các tác vụ khác hoàn thành trước khi thực hiện tác vụ tiếp theo bằng cách sử dụng các hàm bất đồng bộ (asynchronous functions) hoặc các gọi hệ thống không đồng bộ (asynchronous system calls), mỗi tác vụ được thực hiện trên cùng một luồng Kỹ thuật này thường được sử dụng trong các ứng dụng web, khi cần xử lý các yêu cầu HTTP đến từ nhiều người dùng khác nhau cùng một lúc, và trong các ứng dụng desktop khi cần tương tác với các tác vụ I/O như đọc/ghi dữ liệu từ đĩa cứng 1.3 So sánh lập trình đồng bộ và lập trình bất đồng bộ: Ưu điểm của lập trình đồng bộ: Các hoạt động xảy ra tuần tự nên có thể dễ quản lý, dễ debug và phát hiện vấn đề khi xảy ra lỗi NHÓM 07 4 LẬP TRÌNH MẠNG ĐỀ TÀI 03 Vấn đề: Nếu thời gian chạy các hoạt động đồng bộ xảy ra quá dài thì UI sẽ bị lock (đứng chương trình) do UI và các hoạt động đồng bộ cùng thuộc về 1 thread Ví dụ: Đơn giản nhất là khi ta làm việc với api lấy danh sách users từ database hay từ file Trong trường hợp data quá lớn thì việc api này sẽ trả về rất lâu(thời gian chờ lâu) Nếu ta lập trình đồng bộ (synchronous) thì chương trình sẽ bị đứng (block UI) do ta phải đợi gọi xong api thì khi đó thread duy nhất UI mới được giải phóng và làm việc khác Vậy thread là gì: như hình minh họa ở trên 1 process(hay còn được hiểu là 1 chương trình) sẽ bao gồm nhiều threads Mỗi thread có thể thực hiện các hoạt động khác nhau Ví dụ: Khi ta mở 1 ứng dụng web nghe nhạc Ta vừa có thể play nhạc, vừa có thể làm các hành động khác: pause, next, back, view list songs bởi vì mỗi hành động là một thread(một luồng riêng biệt) NHÓM 07 5 LẬP TRÌNH MẠNG ĐỀ TÀI 03 Ưu điểm của lập trình bất đồng bộ: Bởi vì không bị block thread và các hoạt động có thể không phải đợi nhau nên khi xử lý các tác vụ có thời gian thực hiện lâu không bị đứng chương trình, đem lại trải nghiệm người dùng tốt Vấn đề: Bởi vì các hoạt động thực hiện không theo thứ tự nên ta phải quản lý các hành động này một cách cẩn thận Ví dụ như khi bạn xử lý hành động submit 1 form, đầu tiên phải validate dữ liệu, sau đó mới tới phần xử lý Nếu như quản lý không tốt phần bất đồng bộ có thể dẫn tới: Phần xử lý chạy trước cả phần validate dữ liệu -> có thể gây ra lỗi nghiêm trọng 1.4 Lập trình bất đồng bộ trong C#.Net: Lập trình bất đồng bộ thường được sử dụng trong các xử lý tiềm ẩn blocking, giống như truy cập tới website, việc truy cập tài nguyên trên web đôi lúc là chậm trễ Ngoài ra có một số xử lý khác nên được xây dựng bất động bộ như: Làm việc trên file, ảnh, Từ Net Framework 4.5 và Windows Runtime sẽ có một số phương thức trong các APIs hỗ trợ bất đồng bộ như ở dưới: ✓ Web access: HttpClient, SyndicationClient ✓ Working with files: StorageFile, StreamWriter, StreamReader, XmlReader ✓ Working with images: MediaCapture, BitmapEncoder, BitmapDecoder ✓ WCF programming: Synchronous and Asynchronous Operations NHÓM 07 6 LẬP TRÌNH MẠNG ĐỀ TÀI 03 C# hỗ trợ nhiều mô hình lập trình bất đồng bộ để giúp giải quyết các vấn đề về hiệu suất và độ trễ trong các ứng dụng Dưới đây là các mô hình lập trình bất đồng bộ chính trong C#: Asynchronous Programming Model (APM): là mô hình kế thừa sử dụng giao diện IAsyncResult để cung cấp hành vi không đồng bộ Trong mẫu này, các thao tác không đồng bộ yêu cầu Begin và End các phương thức (ví dụ: BeginWritevà EndWriteđể triển khai thao tác ghi không đồng bộ) Đây là một mô hình lập trình bất đồng bộ cổ điển Trong mô hình này, bạn định nghĩa một hàm gọi lại (callback function) mà sẽ được gọi khi tác vụ bất đồng bộ hoàn thành Hàm gọi lại này được truyền vào phương thức bất đồng bộ làm tham số Event-based Asynchronous Pattern (EAP): là mô hình kế thừa dựa trên sự kiện để cung cấp hành vi không đồng bộ Nó yêu cầu một phương thức có Async hậu tố và một hoặc nhiều sự kiện, loại ủy quyền trình xử lý sự kiện và EventArg loại có nguồn gốc Đây là một mô hình lập trình bất đồng bộ chuẩn được định nghĩa bởi Microsoft Trong mô hình này, bạn sử dụng các sự kiện để thông báo về tiến trình của tác vụ bất đồng bộ Các sự kiện này được kích hoạt khi tác vụ bắt đầu, tiến trình thay đổi hoặc kết thúc EAP đã được giới thiệu trong NET Framework 2.0 Task-based Asynchronous Pattern (TAP): Đây là mô hình lập trình bất đồng bộ mới nhất được định nghĩa bởi Microsoft Trong mô hình này, bạn sử dụng đối tượng Task để đại diện cho tác vụ bất đồng bộ và sử dụng từ khóa async và await để lập trình bất đồng bộ TAP đã được giới thiệu trong NET Framework 4 APM ra đời đầu cùng với những phiên bản Net đầu tiên EAP ra đời sau và hoạt động dựa trên sự kiện APM và EAP không được khuyến khích sử dụng nữa, TAP xuất hiện gần đây nhất và thay đổi hoàn toàn cách lập trình bất đồng bộ TAP được xây dựng trên bộ thư viện TPL (Task Parallel Library, dùng cho xử lí song song) Task-based Asynchronous Pattern (TAP) là một mô hình lập trình bất đồng bộ trong C# được sử dụng để thực hiện các tác vụ đồng thời mà không chặn luồng chính NHÓM 07 7 LẬP TRÌNH MẠNG ĐỀ TÀI 03 Server lắng nghe và đợi để chấp nhận yêu cầu nếu có client kết nối vào: Tuy nhiên, nếu như chưa có client nào kết nối hoặc quá trình kết nối bị gián đoạn, dẫn đến thời gian chờ quá lâu, thì chương trình sẽ bị đứng và không phản hồi Vì chương trình thực hiện bằng mô hình đồng bộ nên các lệnh được thực thi tuần tự Do đó, server sẽ lắng nghe, đến khi nào có chấp nhận kết nối mới thực hiện các hành động khác, tất cả các hoạt động khác sẽ bị block và phải đợi cho đến khi listenerSocket.Accept() đó hoàn thành trước khi được thực hiện NHÓM 07 16 LẬP TRÌNH MẠNG ĐỀ TÀI 03 Tiến hành cho client kết nối vào, server chấp nhận kết nối, chương trình phản hồi trở lại và tiếp tục thực hiện các lệnh phía sau: Như vậy, nếu sử dụng mô hình đồng bộ trong lập trình socket thì trong quá trình nhận kết nối từ client trên server, chương trình không thể làm bất cứ điều gì khác ngoài việc chờ đợi dẫn đến chương trình bị đứng và các luồng khác bị block Điều này dẫn đến thời gian phản hồi chậm và hiệu suất kém Do đó, để cải thiện hiệu suất và tối ưu hóa thời gian phản hồi của các ứng dụng socket thì trong lập trình socket, sẽ sử dụng mô hình bất đồng bộ 2.3 Accepting a TCPClient Connection Asynchronously with await keyword in C#: Sử dụng async và await để tiến hành lập trình sever theo mô hình bất đồng bộ NHÓM 07 17

Ngày đăng: 09/03/2024, 11:27

Tài liệu cùng người dùng

Tài liệu liên quan