2013-11-01 148 views
3

我需要根據他的IP地址和特定端口將所有類型的文件傳輸給特定用戶。因此,無論何時在指定端口(服務器正在等待文件的端口)發出新請求,一個文件被傳輸,如果它在另一個端口傳輸一些聊天消息。使用套接字文件傳輸

我的問題是我需要發送的文件名稱和大小以及其內容,以便在客戶端一個新的下載文件將被創建(具有相同的名稱)作爲發送的文件。我如何去this.Also我需要知道文件的大小,這樣我可以創建一個字節數組接收content.And我的代碼here.Please幫我

public void fileClient() 
     { 
      TcpClient client = new TcpClient(); 
      client.Connect(IPAddress.Parse("127.0.0.1"), 40399); 
      Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); 
      dlg.ShowDialog(); 
      string fileName = dlg.FileName; 
      FileInfo fi = new FileInfo(fileName); 
      string fileNameandSize = fi.Name + "." + fi.Length; 
      byte[] fileContents = File.ReadAllBytes(fileName); 
         Stream stream = client.GetStream(); 
       stream.SetLength(fi.Length);//If i set the file length here am getting an exception 
         stream.Write(fileContents, 0, fileContents.Length); 
      client.Close(); 
     } 

public void fileServer() 
    { 
     TcpListener list; 
     Int32 port1 = 40399; 
     list = new TcpListener(port1); 
     list.Start(); 
     TcpClient client = list.AcceptTcpClient(); 
     MessageBox.Show("Client trying to connect"); 
     Thread.Sleep(10); 
      Stream stream = client.GetStream(); 
     byte[] receivedBytes = new byte[stream.Length]; 
     stream.Read(receivedBytes, 0, Convert.ToInt16(stream.Length)); 
        string fileName = "C:\\Users\\dhivya.s\\Desktop\\Recent received"; 
        File.WriteAllBytes(fileName + "\\" + "newFile", receivedBytes); 
     list.Stop(); 
     client.Close(); 
    } 
+0

您需要定義通信_protocol_爲您的應用。這可以是帶內或帶外的。 –

+0

我無法理解你的評論 –

+0

這兩個人如何溝通,以告訴對方發生了什麼。雖然套接字被整齊地包裝到一個類中,但您需要定義雙方說話的語言。對他們來說,他們只是獲取字節數據。你需要某種方式說「嗨,我給你一個文件」,這樣對方知道該期待什麼 –

回答

2

文件傳輸這樣的依靠在兩端之間有一個議定的協議。例如,您可以定義一個簡單的協議,其中前四個字節指定文件名的大小,後四個文件的大小。然後發送文件名,然後發送內容。然後,所有你必須擔心的是,電線的兩端是使用大還是小端。如果他們是一樣的,你很好。

這就是爲什麼套接字通常不是通信的好選擇。有很多現有的文件傳輸協議(HTTP,FTP,AMF等),已經爲你處理這些東西。那麼爲什麼不使用其中之一呢?

+0

你知道有哪些網站可以參考類似的例子嗎? –

+0

Nto忘記了,當你想實現安全性時,像HTTP和FTP這樣的協議對此有本地支持 –

1

沒有任何檢查,這似乎工作。您可以添加校驗和等,解碼b64保存文件。

public class FileTransfer 
{ 
    public string Name; 
    public int Size; 
    public string Content; 
} 

發送:

FileTransfer fileTransfer = new FileTransfer(); 
fileTransfer.Name = "TestFile"; 
fileTransfer.Content = System.Convert.ToBase64String(File.ReadAllBytes("c:\\data\\test.html")); 
System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(fileTransfer.GetType()); 
TcpClient client = new TcpClient(); 
client.Connect(IPAddress.Parse("127.0.0.1"), 40399); 
Stream stream = client.GetStream(); 
x.Serialize(stream, fileTransfer); 
client.Close(); 

建議:

TcpListener list; 
Int32 port1 = 40399; 
list = new TcpListener(port1); 
list.Start(); 
TcpClient client = list.AcceptTcpClient(); 
Console.WriteLine("Client trying to connect"); 
Stream stream = client.GetStream(); 
XmlSerializer mySerializer = new XmlSerializer(typeof(FileTransfer)); 
FileTransfer myObject = (FileTransfer)mySerializer.Deserialize(stream); 
Console.WriteLine("name: " + myObject.Name); 
list.Stop(); 
client.Close();