gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:54:49 25 4
gpt4 key购买 nike

我已经实现了一个 Android 应用程序,它使用 SP 相机拍照并通过套接字将其发送到服务器。

我正在使用以下 (JAVA) 代码读取本地存储的图像文件,并通过套接字以连续的 block 形式发送它:

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
  • 我发送图片或读取图片的代码不正确吗?

在此先感谢您提供的任何帮助,因为我真的被困住了!

最佳答案

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

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

中途之家是重复说“这是一个数据长度为 X 的 block ”,然后是“我完成了,没有更多的 block ”消息(例如“这是一个数据长度为 0 的 block ”) ).这样您就不需要事先知道总长度。

关于java - 通过 Socket 发送的图像流 - 服务器死锁问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12070203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com