我已经实现了一个Android应用程序,它使用SP摄像头拍照并通过套接字发送到服务器。
我正在使用以下(JAVA)代码来读取本地存储的图像文件,并通过套接字以连续的块发送它:
FileInputStream fileInputStream = new FileInputStream( "my_image_file_path" );
int nRead;
byte[] data = new byte[16384];
try {
while( (nRead = fileInputStream.read(data, 0, data.length)) != -1 ){
networkOutputStream.write( data, 0, nRead );
}
} catch( IOException e ){
e.printStackTrace();
}
fileInputStream.close();
以下(C / C ++)代码读取并将其存储在服务器上:
char newbuffer[MAX_BUF_SIZE];
int checkOperation;
ofstream outfile( "image_file_path".c_str(), ofstream::binary );
do{
checkOperation = read( clientSocketDescriptor, newbuffer, sizeof(newbuffer) );
if( checkOperation < 0 ){
cout << "Error in recv() function, received bytes = " << checkOperation << endl;
exit(1);
}else if (checkOperation != 0 ){
/*
* some data was read
*/
cout << endl << "READ Bytes: " << checkOperation << endl;
outfile.write( newbuffer, checkOperation );
/*
* emptying buffer for new incoming data
*/
for(int i = 0; i < sizeof(newbuffer); i++){
newbuffer[i] = 0;
}
}
}while( checkOperation =! 0 );
outfile.close();
Android客户端应用程序似乎正确写入套接字中的所有字节,并成功退出while
循环。
然而,服务器代码在其while
循环的最后一次迭代中停滞不前,并且无法继续执行。
EOF
?提前感谢任何帮助,因为我真的被困了!
答案 0 :(得分:3)
您没有关闭networkOutputStream
,因此C ++代码不知道您已完成。
您需要关闭输出流 - 这显然只有在您不需要再发送任何数据时才可行 - 或者您需要在协议中包含一些元数据,以便在开始编写之前指示有更多的数据,或者之后包含的东西作为“完成”指标。一般来说,我更喜欢长度前缀 - 如果“完成”指标自然出现在数据中,则比担心转义要简单得多。
一个中途的房子是反复说“这里有一大块数据长度为X”,然后是“我已经完成,没有更多的块”消息(可能是“这里是一块数据长度为0”,例如)。这样您就不需要事先了解总长度。