2015-10-05 56 views
1

我是編程新手。對於第一個應用程序,我決定創建兩個控制檯應用程序 - 服務器和客戶端應用程序我想測試客戶端和服務器端應用程序之間的數據事務帶寬(按照我使用套接字的方式)。我遇到的問題是我需要測試連接速度,比如說10秒鐘,在這10秒鐘之後,我需要獲取接收到的數據量(我已經收到了這段時間)並計算速度......我該怎麼做那?c#測試服務器和客戶端應用程序之間的帶寬

客戶端應用程序

namespace Example_01_Sockets_Client 
{ 
class MainClass 
{ 
    public static void Main(string[] args) 
    { 
     try 
     { 
      var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

      var ownAddress = IPAddress.Parse("127.0.0.1"); 
      var ownEndpoint = new IPEndPoint(ownAddress, 4321); 

      socket.Bind(ownEndpoint); 

      Console.WriteLine(); 
      Console.WriteLine("Trying to connect to server..."); 
      var serverAddress = IPAddress.Parse("127.0.0.1"); 
      socket.Connect(serverAddress, 2222); 
      Console.WriteLine("Connected to server"); 

      var buffer = new byte[1024 * 150000]; 
      socket.ReceiveTimeout = 100; 

      int receivedBytesLen = socket.Receive(buffer); 

      Console.WriteLine("Download speed: " + ((receivedBytesLen)/100 + "kb/s ")); 

      Console.WriteLine("Press any key to exit"); 
      Console.ReadKey(); 
      socket.Close(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 
} 
} 

服務器應用

class MainClass 
{ 
    public static void Main(string[] args) 
    { 
     bool exit = false; 

     while (!exit) 
     { 
      var listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

      IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); 
      IPEndPoint localEndpoint = new IPEndPoint(ipAddress, 2222); 

      listeningSocket.Bind(localEndpoint); 
      listeningSocket.Listen(1); 

      Console.WriteLine(); 
      Console.WriteLine("Waiting for client..."); 
      Socket connectedSocket = listeningSocket.Accept(); 
      listeningSocket.Close(); 
      string clientAddress = connectedSocket.RemoteEndPoint.ToString(); 
      Console.WriteLine("Client connected (" + clientAddress + ")"); 

      string fileName = "downTest.txt"; 
      byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName); 

      byte[] fileData = File.ReadAllBytes(fileName); 
      byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length]; 
      byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length); 

      fileNameLen.CopyTo(clientData, 0); 
      fileNameByte.CopyTo(clientData, 4); 
      fileData.CopyTo(clientData, 4 + fileNameByte.Length); 

      connectedSocket.Send(fileData); 

      //int bytesReceived = connectedSocket.Receive(); 

      Console.WriteLine("Client connected (" + clientAddress + ")"); 

      connectedSocket.Close(); 
     } 
    } 
} 

感謝您的幫助!

回答

1

爲什麼不使用一定數量的數據(例如4,096kb)。在您開始在客戶端上下載數據之前,使用Stopwatch類啓動計時器,然後在完成發送後立即停止計時器。然後,您可以使用elapsed time屬性來確定發送該固定數量數據需要多長時間。

  Stopwatch timer = new Stopwatch(); 
      timer.Start(); 

      // Download data here 

      timer.Stop(); 

      int elapsedTime = timer.Elapsed.TotalSeconds; 
+0

是的,我在想它,這將是一個最簡單的解決方案。但我想知道是否有可能測試連接設置一段時間?例如我有4kb的大文件,如果我有400mbit/s的下載速度 - 下載將運行得更快。但是,例如,如果我有500mb的大文件和1mbit/s的快速連接 - >它需要很長時間來運行測試))) –

+0

做一個小樣本(幾兆字節),並獲得一個粗略的速度。然後根據這個調整實際測試的大小。通過電線發送GB數據以測試快速連接可能在任何情況下都不是謹慎的,因此另一種解決方案是獲得良好的「中間地帶」大小。 使用套接字超時並不是一個好的解決方案,因爲這會在超時發生時導致異常,並且您不知道接收了多少數據。最後,所有這些緩衝區意味着將數據加載到內存中。如果您嘗試發送/接收太多,您將測試磁盤I/O。 – DVK

相關問題