CÁC GIẢI PHÁP LẬP TRÌNH C# - Trang 464

464
Chương 11: Lập trình mạng

Lớp

NetworkStream

hỗ trợ việc sử dụng bất đồng bộ thông qua phương thức

BeginRead

BeginWrite

. Sử dụng các phương thức này, bạn có thể gửi hay nhận một khối dữ liệu trên một

trong các tiểu trình do thread-pool của bộ thực thi .NET cung cấp, mà không block mã lệnh
của bạn. Mục này trình bày kỹ thuật ghi bất đồng bộ.
Khi gửi dữ liệu một cách bất đồng bộ, bạn phải gửi dữ liệu nhị phân thô (một mảng byte). Và
bạn cần chọn kích thước mỗi lần gửi hay nhận. Ví dụ dưới đây viết lại server từ mục 11.11
sao cho mỗi lớp

ClientHandler

gửi một lượng lớn dữ liệu được đọc từ một file. Dữ liệu này

được gửi một cách bất đồng bộ, nghĩa là

ClientHandler

có thể tiếp tục thực hiện các tác vụ

khác (trong ví dụ này, nó chỉ việc lấy các thông điệp được gửi từ client).
Một thuận lợi của cách tiếp cận này là toàn bộ nội dung của file chẳng bao giờ nằm trong bộ
nhớ một lượt. Thay vào đó, nó được thu lấy ngay trước khi một khối mới được gửi. Một thuận
lợi khác nữa là server có thể hủy bỏ thao tác vào bất cứ lúc nào. Ví dụ, nếu client chỉ đọc đến
khối dữ liệu thứ ba thì ngắt kết nối, server sẽ thiết lập một biến thành viên luận lý có tên là

fileStop

để báo cho callback không gửi dữ liệu nữa.

Dưới đây là lớp

ClientHandler

đã được sửa đổi (lớp

TcpServerTest

không cần thay đổi gì):

using System;

using System.Net;

using System.Net.Sockets;

using System.IO;

using SharedComponent;

public class ClientHandler {

private TcpClient client;

private string ID;

// Kích thước một khối dữ liệu (2 KB).

private int bufferSize = 2048;

// Bộ đệm dùng để chứa dữ liệu.

private byte[] buffer;

// Dùng để đọc dữ liệu từ một file.

private FileStream fileStream;

// Dùng để giao tiếp với client.

private NetworkStream networkStream;

// Dấu hiệu ngừng gửi dữ liệu.

private bool fileStop = false;

Liên Kết Chia Sẽ

** Đây là liên kết chia sẻ bới cộng đồng người dùng, chúng tôi không chịu trách nhiệm gì về nội dung của các thông tin này. Nếu có liên kết nào không phù hợp xin hãy báo cho admin.