使用套接字传输文件

时间:2013-11-01 15:39:51

标签: c# wpf sockets file-transfer

我需要根据他的IP地址和特定端口将所有类型的文件传输给特定用户。因此,只要新请求到达指定端口(servere等待文件的端口),就意味着文件是转移,如果它在另一个端口转移了一些聊天消息。

我的问题是我需要发送文件名和大小及其内容,以便在客户端创建一个新的下载文件(具有相同的名称)作为发送文件。我怎么去关于this.Also我需要知道文件的大小,以便我可以创建一个字节数组来接收内容。我的代码在这里。请帮帮我

   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();
    }

2 个答案:

答案 0 :(得分:2)

这样的文件传输依赖于端点之间存在协议的协议。例如,您可以定义一个简单的协议,其中前四个字节指定文件名的大小,接下来的四个字节指定文件的大小。然后发送文件名,然后发送内容。然后你要担心的是线的两端是使用大端还是小端。如果它们是相同的,那你很好。

这就是为什么套接字通常不是通信的好选择。有很多现有的传输文件协议(HTTP,FTP,AMF等),已经为你处理了这些东西。那么为什么不使用其中一个?

答案 1 :(得分: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();

REC:

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();