gpt4 book ai didi

java - 套接字文件传输 : Receiver stuck in reading from buffer/writing to storage

转载 作者:太空狗 更新时间:2023-10-29 13:35:05 25 4
gpt4 key购买 nike

static void sendFile(Socket socket, File file) throws IOException {

File testFile = new File( Environment.getExternalStorageDirectory().toString()+"/DCIM/Camera/Test.jpg");
byte [] buffer = new byte[(int)testFile.length()];
FileInputStream fis = new FileInputStream(testFile);
BufferedInputStream bis = new BufferedInputStream(fis);
Log.d(DebugTag, "Trying to read testFile from storage into buffer");
bis.read(buffer,0,buffer.length);
Log.d(DebugTag, "Read testFile into buffer");
OutputStream os = socket.getOutputStream();
Log.d(DebugTag, "Trying to write testFile from buffer into output stream");
os.write(buffer, 0, buffer.length);
Log.d(DebugTag, "Wrote testFile from buffer into output stream");
os.flush();
Log.d(DebugTag, "Outputstream flushed");
}

static void receiveFile(Socket socket) throws IOException {

InputStream is = socket.getInputStream();
String receivedFileDirectory = Environment.getExternalStorageDirectory().toString()+"/Pictures/receivedFile.jpg";
File receivedFile = new File(receivedFileDirectory);
//check if directory exists, otherwise create it
if (receivedFile.exists()) {
Log.d(DebugTag, "Filename at destination already exists");
} else if (!receivedFile.exists()) {
Log.d(DebugTag, "Filename at destination does not exist, trying to create it!");
receivedFile.createNewFile();
Log.d(DebugTag, "Created file!");
}

Log.d(DebugTag, "Preparing file reception. Destination:"+receivedFileDirectory);
OutputStream os = new FileOutputStream(receivedFileDirectory);
Log.d(DebugTag, "established outputstream to file directory");
byte[] buffer = new byte[2048];
int length;
Log.d(DebugTag, "Trying to read inputstream into buffer and write file to destination");
while ((length = is.read(buffer)) >0 ) {
os.write(buffer,0,length);
}
Log.d(DebugTag, "File received.");
os.flush();
os.close();
is.close();
Log.d(DebugTag, "Closed in and out streams");

}

发件人文件似乎工作正常,我收到每条日志消息,直到“输出流刷新”。在接收端,一切似乎都很顺利,直到代码到达 while 循环:我收到的最后一条日志消息始终是“尝试将输入流读入缓冲区并将文件写入目标”,但不是“已接收文件”和以下消息.奇怪的是:我收到测试文件并可以打开它(虽然需要几秒钟 - 不知道这是否是 android 的典型情况)。有什么线索说明为什么代码会卡在 while 循环中吗?

第二个问题:这是我的第一个 Android/Java 应用程序。这段代码可以通过套接字发送和接收文件吗?即使文件变大(高达 >100MB)?

提前致谢!

最佳答案

is.read(buffer) 只有在正常关闭连接的另一端(或在错误时抛出异常)时才会返回零,所以你缺少的是 socket.close() 在发送端。

os.flush() 在这里是不够的,因为 TCP 不知道您何时完成发送数据。

关于java - 套接字文件传输 : Receiver stuck in reading from buffer/writing to storage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11493079/

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