2013-11-01 146 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();