我的Java客户端使用以下代码将文件发送到C ++服务器:
FileInputStream fileInputStream = new FileInputStream(path);
byte[] buffer = new byte[64*1024];
int bytesRead = 0;
while ( (bytesRead = fileInputStream.read(buffer)) != -1)
{
if (bytesRead > 0)
{
this.outToServer.write(buffer, 0, bytesRead);
}
}
我的C ++服务器使用以下代码接收字节:
vector<char> buf5(file_length);
size_t read_bytes;
do
{
read_bytes = socket.read_some(boost::asio::buffer(buf5,file_length));
file_length -= read_bytes;
}
while(read_bytes != 0);
string file(buf5.begin(), buf5.end());
然后使用以下代码创建文件:
ofstream out_file( (some_path).c_str() );
out_file << file << endl;
out_file.close();
但是,在此过程中,文件会以某种方式损坏。
在过程结束时,两个文件(发送的文件和创建的文件)具有相同的大小。
我做错了什么?任何帮助将不胜感激!
编辑:尝试使用不同的代码接收文件,结果相同:
char buf[file_length];
size_t length = 0;
while( length < file_length )
{
length += socket.read_some(boost::asio::buffer(&buf[length], file_length - length), error);
}
string file(buf);
答案 0 :(得分:2)
1)是文本文件吗? 2)如果没有尝试在写入之前以二进制模式打开文件,也不要使用&lt;&lt;运算符,而是使用write或put方法
答案 1 :(得分:0)
在您的第一个示例中,问题似乎是这一行:
read_bytes = socket.read_some(boost::asio::buffer(buf5,file_length));
这会导致您覆盖字符串的前N个字节,而不是正确附加多个读取。
在你的第二个例子中,问题很可能是:
string file(buf);
如果buf
包含任何NUL字符,则字符串将被截断。使用与第一个示例中相同的字符串创建std::vector<char>
。
如果您仍有问题,我建议您对源文件和复制文件进行二进制差异处理(大多数十六进制编辑器可以执行此操作)。这可以让您更好地了解差异的确切位置以及可能导致差异的原因。