java/android OutputStream块,但在使用套接字时不够长

java/android OutputStream块,但在使用套接字时不够长,java,android,sockets,block,outputstream,Java,Android,Sockets,Block,Outputstream,因此,我正在编写一个应用程序,它获取一个图像,并立即使用套接字将其发送到远程计算机 OutputStream mStream; mStream = mySocket.getOutputStream(); /* filling header/bmbytes*/ mStream.write(header); mStream.write(BitmapBytes); mStream.flush(); //not working? /*try { wait(2000); } catch

因此,我正在编写一个应用程序,它获取一个图像,并立即使用套接字将其发送到远程计算机

OutputStream mStream;

mStream = mySocket.getOutputStream();

/* filling header/bmbytes*/
mStream.write(header);
mStream.write(BitmapBytes);

mStream.flush(); //not working?

/*try { 
    wait(2000);
} catch (InterruptedException e) {

}*/
mStream.close();
写函数工作得很好,直到最后几KB。不发送随机数据量约295 kb,300 kb为宜。正如我所读到的,这是因为它在缓冲所有数据之前一直处于阻塞状态,但它似乎并不关心数据是否实际发送,所以调用mStream.close太早了。如果我取消对wait部分的注释,它工作得很好,但是我可能需要每秒调用一次以上,而且它仍然不可靠依赖于连接,因此我需要另一种方法来正确调用close。同花顺似乎没什么作用。我用错了吗? 任何想法都值得赞赏。谢谢。

看看这个例子

尝试按部分发送数据,而不是一个一个地发送数据。 比如:

看看这个例子

尝试按部分发送数据,而不是一个一个地发送数据。 比如:


此代码发送所有数据。问题出在接收端


在关闭之前,休眠和刷新都是毫无意义的。

此代码发送所有数据。问题出在接收端


在关闭之前,休眠和刷新都是毫无意义的。

问题是,代码等待答案,因此保证发送所有数据。我的图片小于1MB,这是在那里使用的数据包的大小。我需要关闭conn,以便告诉接收器传输结束,但像这样,最后几个字节丢失了。这个主意很好,就是行不通,谢谢。你是否尝试发送大于2Mb的数据,丢失了多少数据?操作系统版本?上传是在一个单独的线程中完成的吗?典型的误用可用,并且不需要“按部分发送数据”。问题是,代码等待答案,因此保证所有数据都被发送。我的图片小于1MB,这是在那里使用的数据包的大小。我需要关闭conn,以便告诉接收器传输结束,但像这样,最后几个字节丢失了。这个主意很好,就是行不通,谢谢。你是否尝试发送大于2Mb的数据,丢失了多少数据?操作系统版本?上传是在一个单独的线程中完成的吗?典型的误用可用,并且没有必要“按部分发送数据”。为什么您确定问题在写端而不是读端?您解决过这个问题吗?我也有同样的问题。最简单的原因是输入没有被完全读取,缺少一个结束符。我知道这可能太简单了。为什么你确定问题出在写端而不是读端?你解决过这个问题吗?我也有同样的问题。最简单的原因是输入没有被完全读取,缺少一个结束符。我知道这可能太简单了。
while (bytesRead > 0)
{
    outputStream.write(buffer, 0, bufferSize);
    bytesAvailable = fileInputStream.available();
    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}