2010-07-09 29 views
5

Tôi có một lớp có sử dụng 'System.Net.Sockets.Socket' trực tiếp cho comunication mạng, và hiện nay tôi sử dụng hai giao diện sau đây để phá vỡ sự phụ thuộc vào các lớp Socket:Làm cách nào để mô phỏng đúng thời gian chờ cao trên thử nghiệm máy chủ socket C#?

public interface ISocketListener 
    { 
     void Listen(int backlog); 

     ISocket Accept(); 

     void Bind(EndPoint endpoint);    
    } 

public interface ISocket 
    { 
     void Connect (EndPoint ep); 

     Stream CommunicationStream { get; } 

     void Close(); 

     void Close(int timeout); 

     void Shutdown(); 
    } 

Trong việc thực hiện sản xuất tôi chỉ chuyển hướng tất cả các cuộc gọi phương thức đến đối tượng Socket riêng. Trong môi trường thử nghiệm, tôi sử dụng MemoryStream làm đường truyền thông giữa các ổ cắm. Vì tôi có ít kinh nghiệm về chủ đề này, một số câu hỏi xuất hiện trong đầu tôi khi viết bài kiểm tra: Có bất kỳ thực hành tốt 'chính thức' nào trong thử nghiệm loại phần mềm này không? Khi thực hiện thử nghiệm tích hợp, làm cách nào để kiểm tra hiệu suất của máy chủ này trong nhiều kết nối/tình huống độ trễ cao (cụ thể hơn, cách mô phỏng các tình huống này)? Tại sao có các phiên bản không đồng bộ của Socket.Accept/Socket.Receive? Tôi có thể thay thế các phương thức không đồng bộ để xử lý các phiên bản đồng bộ của chúng trong các luồng riêng biệt không?

Trả lời

0

Có bất kỳ thực hành tốt 'chính thức' nào khi thử nghiệm loại phần mềm này không?

Tôi có thể nói điều này nhưng tôi chắc chắn có một số thông tin tốt ở đây trên ngăn xếp hoặc trong tự nhiên.

Khi làm thử nghiệm tích hợp, làm thế nào nào để tôi kiểm tra việc thực hiện các máy chủ này trong nhiều kết nối/cao tình huống độ trễ (cụ thể hơn, làm thế nào để mô phỏng các tình huống này)?

Để bắt đầu đơn giản hãy viết một số kiểm tra và ghi nhật ký, chạy chúng trên một hộp riêng, đóng búa với máy chủ yêu cầu ... bao gồm cả vô nghĩa. Chạy log4net trên cả hai cũng sẽ hữu ích. Giới thiệu một số độ trễ có thể được thực hiện, như đã đề cập, thông qua một loại proxy ... một hộp nằm giữa máy khách và máy chủ. Máy khách chỉ vào proxy và proxy sửa đổi dữ liệu ... trễ, thay đổi thứ tự gói, vv .... gửi đến máy chủ ... đảo ngược và lặp lại. Là một chút sang một bên ... Tôi sẽ tránh Thread.Sleep (...). Tốt hơn để sử dụng một cái gì đó như thế này:

lock (timelock) { Monitor.Wait(timelock, TimeoutInMilliseconds); } 

...phiên bản không đồng bộ của Socket.Accept/Socket.Receive? Tôi có thể thay thế các phương pháp không đồng bộ cho xử lý các phiên bản đồng bộ của chúng trong các chủ đề riêng biệt ?

Bạn có nhiều tùy chọn, phương pháp không đồng bộ, luồng cũ đơn giản, luồng, TPL, v.v. Lựa chọn tốt nhất là ứng dụng cụ thể.

Đây là số Asynchronous Server Socket Example từ mục MSDN trên sockets.

May mắn là có .... sách O'Reilly: C# 4.0 in a Nutshell có bộ tuyệt vời là TCP Server examples bao gồm cả phương thức không đồng bộ/luồng trong biểu thức chặn/không chặn. Đây là một trong các ví dụ ....

public class Server 
    { 
    public void Serve(IPAddress address, int port) 
    { 

     TcpListener listener = new TcpListener(address, port); 
     listener.Start(); 
     while (true) 
     { 
     TcpClient c = listener.AcceptTcpClient(); 
     Task.Factory.StartNew(Accept, c); 
     } 
    } 

    void Accept(object clientObject) 
    { 
     using (TcpClient client = (TcpClient)clientObject) 
     { 
     using (NetworkStream n = client.GetStream()) 
     { 
      byte[] data = new byte[5000]; 

      int bytesRead = 0; int chunkSize = 1; 

      while (bytesRead < data.Length && chunkSize > 0) 
      { 
      bytesRead += 
       chunkSize = n.Read /// Read is blocking 
       (data, bytesRead, data.Length - bytesRead); 
      } 

      Array.Reverse(data); 
      n.Write    /// Write is blocking 
      (data, 0, data.Length); 
     } 
     } 
    } 
    } 

Hy vọng điều này hữu ích.

P.S. Nhận bản sao của C# 4.0 in a Nutshell ... rất tốt.

+0

Cảm ơn lời khuyên, tôi sẽ xem xét cuốn sách. Tôi nghĩ rằng việc thiết lập một máy khác chỉ để thực hiện một số thử nghiệm tích hợp là một chút quá mức cần thiết. Tôi muốn thử nghiệm nhanh và chạy tất cả bằng cách nhấn một nút –

+0

Bạn chắc chắn có thể thực hiện kiểm tra của mình từ cùng một hộp..nhưng..bạn sẽ chia sẻ cùng một ngăn xếp mạng. Vì vậy, kết quả của bạn sẽ hơi lệch. Nó không phải là một máy cắt giao dịch, bạn chỉ cần nhận thức được các tác dụng phụ có thể xảy ra ... thưởng thức. – Rusty

1

Tôi không quen với đối tượng ổ cắm. Tuy nhiên, tôi đã thực hiện một số nghiên cứu về thử nghiệm. Có vẻ như bạn đang đi đúng hướng. Việc viết các giao diện có thể tham chiếu đến các đối tượng thực tế sẽ được sử dụng trong các đối tượng sản xuất hoặc thử nghiệm thường được coi là thực hành tốt. Mẫu này được gọi là "Dependency Injection".

Tôi không biết cách hoạt động của socket, nhưng những gì bạn có thể làm cho mục đích thử nghiệm là tạo một đối tượng thử nghiệm mới để sử dụng thay cho socket bạn muốn kiểm tra. Đối tượng thử nghiệm này có thể chỉ cần gọi Thread.Sleep(x) để thêm thời gian chờ mô phỏng trước khi trả về dữ liệu.

Chỉnh sửa: Tôi cũng muốn chỉ ra rằng bạn sẽ rất cẩn thận để xác định chính xác độ trễ mạng xảy ra trong mã của bạn sao cho khi bạn chèn thời gian chờ nhân tạo cùng một vị trí trong mã nơi nó sẽ xảy ra trong thế giới thực.

+0

Bạn có nghĩa là chia nhỏ một số dữ liệu nhị phân thành các đoạn và gửi từng đoạn bằng cách sử dụng các khoảng Thread.Sleep không? Đó là một giải pháp có thể nhưng tôi không chắc chắn nếu mô phỏng độ trễ cao một cách chính xác, tôi có thể cung cấp cho nó một thử mặc dù. Điều gì về việc xử lý nhiều kết nối đồng thời? làm thế nào mà sẽ được xử lý? –

+0

Điều tôi đang nói là vì bạn đã viết giao diện của riêng mình, bạn sẽ có thể viết một đối tượng thử nghiệm mô phỏng độ trễ và sử dụng nó trong môi trường thử nghiệm của bạn. Tôi không thể nói bất cứ điều gì về các chi tiết về độ trễ được mô phỏng như thế nào. –

1

Bạn có thể mô phỏng độ trễ cao bằng cách tạo máy chủ proxy để ngồi giữa kết nối của bạn, sau đó bạn chỉ có thể thêm độ trễ khi gửi lại dữ liệu.

+0

Bạn có nghĩa là một máy chủ proxy giả mạo? Bạn có thể đưa ra một ví dụ? –

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