C# 使用套接字进行文件传输
我需要根据特定用户的IP地址和特定端口将所有类型的文件传输给特定用户。因此,每当在指定端口(服务器等待文件的端口)收到新请求时,就意味着文件被传输,如果文件在另一个端口,则会传输一些聊天信息 我的问题是我需要有发送的文件名和大小以及它的内容,以便在客户端创建一个新的下载文件(与发送的文件同名)。我如何才能做到这一点。我还需要知道文件的大小,所以我可以创建一个字节数组来接收内容。我的代码在这里。请帮我C# 使用套接字进行文件传输,c#,wpf,sockets,file-transfer,C#,Wpf,Sockets,File Transfer,我需要根据特定用户的IP地址和特定端口将所有类型的文件传输给特定用户。因此,每当在指定端口(服务器等待文件的端口)收到新请求时,就意味着文件被传输,如果文件在另一个端口,则会传输一些聊天信息 我的问题是我需要有发送的文件名和大小以及它的内容,以便在客户端创建一个新的下载文件(与发送的文件同名)。我如何才能做到这一点。我还需要知道文件的大小,所以我可以创建一个字节数组来接收内容。我的代码在这里。请帮我 public void fileClient() {
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();
}
像这样的文件传输依赖于终端之间有一个约定的协议。例如,您可以定义一个简单的协议,其中前四个字节指定文件名的大小,后四个字节指定文件的大小。然后发送文件名,然后发送内容。然后,您需要担心的是,导线的两端是使用大端还是小端。如果他们是一样的,你很好
这就是为什么套接字通常不是通信的好选择。有很多现有的文件传输协议(HTTP、FTP、AMF等),它们已经为您处理了这些内容。那么为什么不使用其中一个呢?不进行任何检查,这似乎是可行的。您可以添加校验和等,解码b64保存文件
public class FileTransfer
{
public string Name;
public int Size;
public string Content;
}
发送:
记录:
您需要为应用程序定义一个通信协议。这可以是带内的,也可以是带外的。我无法理解你的评论,这两个人是如何为了告诉对方发生了什么而一起交流的。当套接字被整齐地包装到一个类中时,您需要定义双方使用的语言。对他们来说,他们只是获取字节数据。你需要说“嘿,我给你发了个文件”因此,另一方知道应该期望什么,这就是我所说的端口选择。因为每当选择文件上载时,它都是我的聊天应用程序,所以它将仅在特定端口发送。在另一方,文件也将仅在特定端口发送,因此它将自动完成。除非你有很好的理由编写自己的文件协议,尝试使用已经存在的协议(如HTTP、FTP、XMPP等)。您知道的任何站点都可以参考类似的示例吗?要忘记,当您想要实现安全性时,HTTP和FTP等协议在这方面具有本机支持
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();