gpt4 book ai didi

Android客户端使用Socket发送大文件,服务器收到的文件不完整

转载 作者:太空宇宙 更新时间:2023-11-03 10:51:08 25 4
gpt4 key购买 nike

我想通过套接字从Android发送一个大文件到服务器,但是服务器收到的文件不完整。

android 上的代码:

 Socket client = new Socket(ipStr, 4444);
OutputStream outputStream = client.getOutputStream();
FileInputStream fileInputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
byte[] buffer = new byte[512];
byte[] sendLen = getBytes(file.length(), true);
outputStream.write(sendLen);
outputStream.flush();

int count;

while ((count = fileInputStream.read(buffer)) > 0)
{
outputStream.write(buffer, 0, count);
}

outputStream.flush();
bufferedInputStream.close();
outputStream.close();
client.close();

服务器上的代码:

byte[] recvHead = new byte[8];
inStream.read(recvHead, 0, 8);
long recvLength = getLong(recvHead, false);
FileOutputStream file = new FileOutputStream(fileName, false);
byte[] buffer = new byte[8192];
int count = 0;

while (count < recvLength) {
int n = inStream.read(buffer);
if(n == -1)
break;
file.write(buffer, 0, n);
count += n;
}

但是服务器会阻塞在read(buffer)中(android发送的文件大约30M)。

奇怪的是:当我在发送文件时向文件添加输出时,服务器可以正常工作。

 FileOutputStream file2 =  new FileOutputStream("/sdcard/testfile" , false);


while ((count = fileInputStream.read(buffer)) >= 0)
{
outputStream.write(buffer, 0, count);
outputStream.flush();

file2.write(buffer, 0, count);
file2.flush();

}

谁能帮我解决这个问题?谢谢!

最佳答案

您不能假设您是这样读取 8 个长度字节的。您可以只读取一个字节到长度数组中。我会为此使用 DataInputStream.readLong() ,并使用 DataOutputStream.writeLong() 来编写它。或者,当您在一个文件后关闭时,完全去掉 length 字,只读到 EOS。

其余代码看起来没问题。如果接收方在 read() 中阻塞,则数据仍在到来,并且发送方仍在发送。

关于Android客户端使用Socket发送大文件,服务器收到的文件不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13061476/

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