通过Socket发送的图像流 - 服务器死锁问题

时间:2012-08-22 09:33:08

标签: java android c++ sockets stream

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

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

1 个答案:

答案 0 :(得分:3)

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

您需要关闭输出流 - 这显然只有在您不需要再发送任何数据时才可行 - 或者您需要在协议中包含一些元数据,以便在开始编写之前指示有更多的数据,或者之后包含的东西作为“完成”指标。一般来说,我更喜欢长度前缀 - 如果“完成”指标自然出现在数据中,则比担心转义要简单得多。

一个中途的房子是反复说“这里有一大块数据长度为X”,然后是“我已经完成,没有更多的块”消息(可能是“这里是一块数据长度为0”,例如)。这样您就不需要事先了解总长度。