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

标签 c# sockets file-transfer

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

System.IO.DirectoryNotFoundException: Could not find a part of the path '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...");

最佳答案

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

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多次。知道需要调用多少次的唯一方法是,您需要事先以某种方式发送整个二进制文件的长度,或者在文件完成客户端后关闭连接并循环构建缓冲区(或将其写出来) in) 直到 Receive 返回 0。

其次,您还应该使用 using确保在发生异常时正确处理您的类(class)
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);
    }
}

关于c# - 从客户端接收文件并在 C# 中保存到服务器中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14732030/

相关文章:

c - 为什么我应该使用或不使用 MSG_CONFIRM?

在内核模块中调用 sock_sendmsg 返回 (-1) 权限被拒绝

Linux 套接字/连接

rest - 对于数据传输,REST API 与 SFTP,哪个更安全?

c# - DDD富域模型和聚合根

c# - 复制范围“如屏幕所示”时,Excel如何计算其生成的图元文件的分辨率?

c# - Azure 见解请求日志

android - 如何使用 NFC 将文件从 (windows) PC 发送到 android/ios?

Java:处理输入流中的大文件

c# - 为什么当变量有值时会报告 "null reference"?