从客户端接收文件并用C#保存到服务器中的文件

本文关键字:文件 保存 服务器 客户端 客户 端接 | 更新日期: 2023-09-27 17:58:12

我想做的是接收客户端发送的文件。但在下面显示的问题行,我得到了一个异常

System.IO.DirectoryNotFoundException:找不到路径"C:''Users''asd''Desktop''"的一部分

这是我的服务器代码:

IPEndPoint ipEnd;
Socket sock;
byte[] clientData = new byte[1024 * 5000];
ipEnd = new IPEndPoint(IPAddress.Any, 5000);
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
sock.Bind(ipEnd);
sock.Listen(5000); 
Socket clientSock=sock.Accept();                
int receivedBytesLen = clientSock.Receive(clientData);
int fileNameLen = BitConverter.ToInt32(clientData, 0);
string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);
BinaryWriter bWrite = new BinaryWriter(File.Open(@"C:'Users'asd'Desktop'"+           fileName,FileMode.Append));//problem Line
bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);
bWrite.Close();
clientSock.Close();               
MessageBox.Show("recieved...");

从客户端接收文件并用C#保存到服务器中的文件

我不会将您的代码保存到桌面,如果您的代码以与您指定的桌面不同的用户身份运行,您可能会遇到权限问题。将您的代码更改为以下内容,看看这是否修复了您的问题

string destFolder = @"C:'ReceivedFiles"
if (Directory.Exists(destFolder) == false)
    Directory.CreateDirectory(destFolder);
BinaryWriter bWrite = new BinaryWriter(File.Open(Path.Combine(destFolder, FileName), FileMode.Append));

关于你的代码的其他问题:

int receivedBytesLen = clientSock.Receive(clientData);

首先,这并不能保证您得到了所有的数据。如果有效负载大于一个数据报,则需要多次调用Receive。知道你需要调用多少次的唯一方法是,你需要在发送之前以某种方式发送整个二进制文件的长度,或者在文件完成后关闭连接。客户端并循环构建缓冲区(或在输入时将其写入),直到Receive返回0。

其次,您还应该使用using来确保在发生异常时正确地处理您的类

using(Socket clientSock=sock.Accept())
{
    //This needs to be redone, see my first point
    int receivedBytesLen = clientSock.Receive(clientData);
    int fileNameLen = BitConverter.ToInt32(clientData, 0);
    string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);
    using(BinaryWriter bWrite = new BinaryWriter(File.Open(@"C:'Users'asd'Desktop'"+           fileName,FileMode.Append)))
    {
        bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);
    }
}