Chúng tôi đang viết một chương trình TCPServer và Client. Có bao nhiêu khoảng trống trong bộ đệm TcpClient? Giống như, tại thời điểm nào nó sẽ bắt đầu vứt bỏ dữ liệu? Chúng tôi đang cố gắng xác định xem TcpClient có thể chặn hay nếu nó đi vào chủ đề nền riêng của nó (để bộ đệm không thể lấy đầy) ..NetworkStream và TcpClient có bao nhiêu bộ đệm?
Trả lời
Bạn có thể lấy kích thước bộ đệm từ TcpClient.ReceiveBufferSize và TcpClient.SendBufferSize.
Kích thước bộ đệm có sẵn sẽ thay đổi khi dữ liệu được nhận/thừa nhận (hoặc không) ở cấp TCP. TcpClient đang chặn theo mặc định.
Không có dữ liệu sẽ được vứt bỏ như là kết quả của bộ đệm đầy đủ, mặc dù dữ liệu có thể được vứt bỏ trong điều kiện lỗi dưới (như ngang hàng biến mất/tai nạn/thoát vv)
Các tài liệu MSDN nói mặc định kích thước của các bộ đệm send và receive cho TcpClient
là 8192 byte hoặc 8K. Tài liệu không chỉ định giới hạn về mức độ lớn của các bộ đệm này.
Như tôi chắc chắn bạn đã biết, bạn gửi và nhận dữ liệu qua số TcpClient
sử dụng đối tượng cơ bản NetworkStream
. Bạn đang kiểm soát việc đây là các hoạt động đồng bộ hoặc không đồng bộ. Nếu bạn muốn có hành vi đồng bộ, hãy sử dụng phương thức Read
và Write
của NetworkStream
. Nếu bạn muốn có hành vi không đồng bộ, hãy sử dụng các hoạt động BeginRead
/EndRead
và BeginWrite
/EndWrite
.
Nếu bạn đang nhận dữ liệu như một phần của một số ứng dụng đầu cuối, tôi khuyên bạn nên làm điều này trong chuỗi phụ, cho dù bạn thực hiện điều này bằng phương pháp không đồng bộ hoặc đồng bộ trong một chuỗi riêng biệt. Điều này sẽ cho phép giao diện người dùng của bạn phản hồi người dùng trong khi vẫn xử lý việc gửi và nhận dữ liệu trong nền.
Chúng ta không chắc chắn nếu chúng ta muốn không đồng bộ, hoặc chỉ làm điều đó đồng bộ trong một chủ đề nền – Earlz
@Earlz, tôi không chắc chắn có một sự khác biệt to lớn giữa hai. Các phương thức không đồng bộ, ví dụ: 'BeginRead(), thực thi các phương thức' AsyncCallback' tương ứng của chúng trên một luồng riêng biệt. Vào cuối ngày, bạn cần sử dụng chuỗi phụ nếu bạn đang cố gửi/nhận dữ liệu trong khi bạn cũng đang xử lý dữ liệu nhập của người dùng từ giao diện người dùng. –
@ MattDavis, đó là một quan niệm sai lầm phổ biến. .Net Các phương thức I/O không đồng bộ thực sự tận dụng một tính năng của hệ điều hành gọi là Cổng Hoàn thành I/O, vì vậy không có luồng nào bị chặn hoặc đang sử dụng trong khi đợi I/O hoặc trong ổ cắm, hoặc từ hệ thống tệp hoặc ống có tên hoặc bất cứ điều gì. –
Vì vậy, nó sẽ tiếp tục nhận dữ liệu cho đến khi máy tính hết bộ nhớ? – Earlz
Không, TCP cung cấp điều khiển luồng. Khi bộ đệm đầy, đầu kia sẽ dừng gửi. – nos
Tôi cũng phụ trách máy chủ, vì vậy nếu điều đó xảy ra, thì điều gì sẽ xảy ra ở máy chủ? Khi nào các bộ đệm của nó cũng sẽ được lấp đầy bằng cách sử dụng 'TcpServer' – Earlz