Thư viện tri thức trực tuyến
Kho tài liệu với 50,000+ tài liệu học thuật
© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

Tài liệu Lập trình Mạng Microsoft .NET Framework phần cuối doc
Nội dung xem thử
Mô tả chi tiết
1.1 Sử dụng TCP một cách bất đồng bộ
V Bạn cần ghi dữ liệu ra network-stream từng khối một, mà không phải block
phần mã lệnh còn lại. Kỹ thuật này có thể được sử dụng nếu bạn muốn
“stream” một file lớn trên mạng.
# Tạo một lớp riêng để xử lý kỹ thuật streaming bất đồng bộ. Bạn có thể bắt đầu
“stream” một khối dữ liệu bằng phương thức NetworkStream.BeginWrite và
cung cấp một phương thức callback. Khi callback được kích hoạt thì gửi khối
kế tiếp.
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).