5

Tôi đang xây dựng máy khách/máy chủ từ xa .NET sẽ truyền hàng nghìn tệp, có kích thước khác nhau (mọi thứ từ vài byte đến hàng trăm MB) và tôi muốn một số phản hồi về phương pháp tốt nhất để đạt được điều này. Như tôi thấy, có một vài tùy chọn:Cách tốt nhất để di chuyển các tệp có kích thước khác nhau trên mạng chậm bằng cách sử dụng .NET

  • Nối tiếp toàn bộ tệp vào đối tượng truy cập từ xa của tôi và truyền cùng một lúc, bất kể kích thước. Điều này có lẽ sẽ là nhanh nhất, nhưng thất bại trong quá trình truyền yêu cầu toàn bộ tập tin phải được truyền lại, không có cách nào để tiếp tục.
  • Nếu kích thước tệp lớn hơn một cái gì đó nhỏ (như 4KB), hãy chia nhỏ thành các khối 4KB và các từ xa, lắp ráp lại trên máy chủ. Ngoài sự phức tạp của điều này, nó chậm hơn vì tiếp tục các chuyến đi khứ hồi và sự thừa nhận, mặc dù một thất bại của bất kỳ một mảnh không lãng phí nhiều thời gian.
  • Bao gồm một số thứ như máy chủ FTP hoặc SFTP với ứng dụng của tôi - máy khách sẽ thông báo cho máy chủ biết rằng máy chủ đang bắt đầu sử dụng tính năng truy cập từ xa, tải tệp lên, sau đó sử dụng tính năng remoting để thông báo hoàn thành. Tôi muốn chứa tất cả mọi thứ trong ứng dụng của tôi thay vì yêu cầu một dịch vụ FTP riêng biệt, nhưng tôi mở ra tùy chọn này nếu cần.
  • Sử dụng một số loại kết nối TCP đã nêu hoặc WPF hoặc một số phương thức truyền khác được xây dựng để xử lý các lỗi hoặc có khả năng thực hiện một số loại trạm kiểm soát/tiếp tục.
  • Bất kỳ người nào khác tôi bị thiếu?

Phương thức truyền tải linh hoạt/đáng tin cậy nhất là gì? Tôi không quan tâm đến tốc độ, nhưng về độ tin cậy - tôi muốn tập tin chuyển động, ngay cả khi nó chậm. Vì máy khách và máy chủ sẽ được đa luồng, tôi có thể truyền nhiều tệp cùng một lúc nếu kết nối cho phép.

Cảm ơn phản hồi của bạn - Tôi sẽ ném tiền thưởng để nhận một số đề xuất về những cách mọi người sẽ thực hiện việc này.

Trả lời

4

BITS (Dịch vụ truyền tải thông minh nền) là một giải pháp tốt. Nó đã có nhiều năm kinh nghiệm xây dựng trong

Một số điểm khởi đầu là

+1

Tôi đã không coi BITS, nhưng đó dường như là chức năng chính xác mà tôi đang cố gắng sao chép - không có ý nghĩa khi viết nó khi nó đã tồn tại. Bạn có biết nếu có cách nào để tải lên mà không cần IIS? Nghiên cứu ban đầu (và không đầy đủ) của tôi dường như nói rằng nó đòi hỏi IIS - không phải là một trình hiển thị, nhưng tôi hy vọng không có bất kỳ phụ thuộc bên ngoài nào. – SqlRyan

0

Đây là bản thân TCP được tạo ra và được điều chỉnh trong nhiều thập kỷ hoặc thử nghiệm cứng. Remoting được thực hiện cho các cuộc gọi RPC nhỏ, không phải chuyển tập tin lớn. Bạn chỉ cần sử dụng một ổ cắm TCP để truyền dữ liệu và để cho các giao thức tầng thấp hơn lo lắng về độ trễ, các cửa sổ truyền, MTU, v.v.

+0

Làm một kết nối TCP tuyên bố (hoặc quản lý một bộ sưu tập toàn bộ của họ từ máy chủ) có vẻ như một nỗi đau lớn, và tha Tôi đang cố gắng tránh. – SqlRyan

1

Mặc dù bình tĩnh trả lời câu hỏi bạn đang yêu cầu từ lớp OSI 4 bên cuộc sống, tôi cảm thấy giống như bạn đang tìm kiếm nhiều hơn ở các tầng ứng dụng trong câu hỏi của bạn. TCP chắc chắn xử lý tất cả mọi thứ khác nhau, từ độ trễ, cửa sổ truyền dẫn, vv ở bên mạng của cuộc sống. Tuy nhiên, nó không trực tiếp xác định điều gì sẽ xảy ra nếu người dùng kết thúc phiên tải xuống sớm và sau đó quyết định chọn nó sau đó, nơi họ rời đi.

Để trả lời câu hỏi của bạn từ một góc độ khác, tôi chắc chắn khuyên bạn nên chunking tệp thành các phần và lập chỉ mục cho tất cả các kết nối, bất kể tốc độ. Sau đó, chúng có thể được lắp ráp lại trên máy khách khi toàn bộ tệp được tải xuống. Điều này cho phép người dùng tạm dừng các phiên tải xuống và tiếp tục. Theo như xác định tốc độ, có thể có phương pháp được xây dựng sẵn để thực hiện điều này, nhưng một phương pháp bạn có thể sử dụng chỉ là xây dựng kiểm tra tốc độ của riêng bạn: Gửi 1 MB cho khách hàng (tải lên) và gửi nó một câu trả lời sau khi nhận được. 1100 chia cho thời gian cần để nhận phản hồi từ khách hàng, là KB/s mà khách hàng cần tải xuống từ máy chủ. Và ngược lại để kiểm tra tải lên từ máy khách.

Theo như truyền, tôi khuyên bạn nên sử dụng các công nghệ hiện có. SFTP hỗ trợ truyền dữ liệu được mã hóa xác thực. Về cơ bản nó là FTP, nhưng trên SSH.Nên có các API có sẵn ở đâu đó để tương tác với điều này.

Trên một lưu ý phụ, tôi chưa bao giờ làm bất cứ điều gì trong phạm vi mà bạn nói, nhưng hy vọng ý tưởng của tôi ít nhất là cung cấp cho bạn một vài lựa chọn để xem xét.

Các vấn đề liên quan