2013-10-18 77 views
1

我想創建一個TcpClient,它通過名稱自動從服務器獲取多個文件。使用TCP客戶端接收多個文件

我想了解一下我如何構建這樣的應用程序。

我的想法是:

做一個for循環包含SwitchCase,在這裏我指定我的文件名。我真的不知道這是否會奏效。

要走出for循環,我可以將索引運算符與文件數進行比較。如果他們相等,那麼我會退出循環。我的想法

例子:

for (int i = 1; i <= 4; i++) 
{ 

switch (----) 
     { 
      case 'file1': 
       code... 
       break; 
      case 'file2': 
       code... 
      case 'file3': 
       code... 
       break; 
      case 'file4': 
       code... 
       break; 
      default: 
       code... 
       break; 
     } 

} 
+0

_From一個server_不是非常特異性的。你將使用哪種協議進行通信? HTTP/FTP /其他? – DeadDog

+0

就我而言,我將使用FTP或HTTP。 –

回答

1

我解決它像這樣:

我的應用程序。從服務器獲取2個文件並移動文件並重命名它們。

測試= mytest的 test111 = TEST2

static string myfile1 = @"C:\inbox\mytest.txt"; 
    static string myfile2 = @"C:\inbox\test2.txt"; 
    //files from server   
    static string myServerfile = @"C:\Users\me\Documents\file_client\bin\Debug\test.csv"; 
    static string myServerfile1 = @"C:\Users\RH-T3\Documents\file_client\bin\Debug\test111.txt"; 


public static void Main(string[] args) 
    { 
      try 
      { 
       for (int i = 0; i < 2; i++) 
       { 
        if (i == 0) 
        { 
         Console.WriteLine("Downloading test.csv"); 
         string fileName = "test.csv"; 
         Console.WriteLine("Client starts..."); 
         //args[0] = Console.ReadLine(); 
         file_client client = new file_client(args); 
         Console.WriteLine("efter file_client..."); 
         NetworkStream serverStream = client.clientSocket.GetStream(); 
         LIB.writeTextTCP(serverStream, fileName); 
         long rest = long.Parse(LIB.readTextTCP(serverStream)); 

         byte[] inStream = new byte[rest]; 

         while (rest != 0) 
         { 
          rest = rest - serverStream.Read(inStream, 0, inStream.Length); 
          Console.WriteLine("REST: " + rest); 

         } 
         FileStream fs = new FileStream(fileName,       FileMode.Create); 
         fs.Write(inStream, 0, inStream.Length); 
         { 
          fs.Close(); 
          serverStream.Close(); 
         } 
         if (File.Exists(myfile1)) 
         { 
          File.Delete(myfile1); 
         } 
         File.Move(myServerfile, myfile1); 

         Console.WriteLine("Moved"); 
         System.Threading.Thread.Sleep(500); 
        } 
        else 
         { 
         Console.WriteLine("Downloading .txt file"); 
         string fileName = "test111.txt"; 
         Console.WriteLine("Client starts..."); 
         //args[0] = Console.ReadLine(); 
         file_client client = new file_client(args); 
         Console.WriteLine("efter file_client..."); 
         NetworkStream serverStream = client.clientSocket.GetStream(); 
         LIB.writeTextTCP(serverStream, fileName); 
         long rest = long.Parse(LIB.readTextTCP(serverStream)); 
         byte[] inStream = new byte[rest]; 
         while (rest != 0) 
         { 
      rest = rest - serverStream.Read(inStream, 0, inStream.Length); 
          Console.WriteLine("REST: " + rest); 
         } 
         FileStream fs = new FileStream(fileName,       FileMode.Create); 
         fs.Write(inStream, 0, inStream.Length); 
         { 
          fs.Close(); 
          serverStream.Close(); 
         } 
         if (File.Exists(myfile2)) 
         { 
          File.Delete(myfile2); 
         } 
         File.Move(myServerfile1, myfile2); 

         Console.WriteLine("Moved"); 
         System.Threading.Thread.Sleep(500); 
        } 
       } 
     } 
       catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
       Console.WriteLine("Cannot be DONE!"); 
      } 
+0

@RamHS thx編輯。我根本沒有看到。 –

2

使用FTP,你可以使用下載文件時FtpWebRequest和HTTP使用HttpWebRequest。 下面是如何請求使用http一個文件一個簡單的例子(該方法用於ftp的類似):

public void Download(string url, string localPath) 
{ 
    HttpWebRequest request = HttpWebRequest.Create(url); 
    HttpWebResponse response = request.GetResponse() as HttpWebResponse; 
    Stream stream = response.GetResponseStream(); 
    FileStream fs = new FileStream(localPath, FileMode.Create); 

    int count; 
    byte[] buffer = new byte[8096]; 
    while ((count = stream.Read(buffer, 0, 8096)) > 0) 
     fs.Write(buffer, 0, count); 

    fs.Dispose(); 
    response.Close(); 
} 

代替使用開關內部的for循環的你應該迭代的數組:

string[] files = new string[]{ url1, url2, ...}; 
for(int i = 0; i < files.Length; i++) 
{ 
    Download(files[i], "file" + i); 
} 
+0

非常感謝您的回答,非常有幫助。如果你有時間可以告訴我,如果我使用RTSP怎麼辦? –

+1

從我可以告訴[RTSP](http://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol)是控制媒體服務器的協議,而不是實際的流媒體。 流式傳輸可由[實時傳輸協議](http://en.wikipedia.org/wiki/Real-time_Transport_Protocol)處理[本文](http://www.codeproject.com/Articles/18977)/How-to-use-the-managed-RTP-API-in-NET-to-c)可能是有用的。 但是爲了傳輸文件,你最好使用ftp或http。 – DeadDog