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
và
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;