0

我已经实现了一个 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
  • 我发送图像或读取图像的代码不正确吗?

提前感谢您的任何帮助,因为我真的被卡住了!

4

1 回答 1

3

您没有关闭networkOutputStream,因此 C++ 代码不知道您已完成。

要么你需要关闭输出流——显然,这只有在你不需要发送更多数据时才可行——或者你需要在协议中包含一些元数据,以便在开始写入更多数据之前进行指示有,或包括一些事后作为“完成”指标。一般来说,我更喜欢长度前缀 - 如果“完成”指示符自然地出现在数据中,它比担心转义要简单得多。

半途而废是重复说“这里有一段数据长度 X”,然后是“我完成了,没有更多的区块”消息(例如,可能是“这里有一段长度为 0 的数据”)。这样你就不需要事先知道总长度。

于 2012-08-22T09:37:42.377 回答