从PC到Android设备的文件下载-大文件的OutputStream write()卡住

曼古斯塔

我正在尝试将文件从PC下载到Android设备(仿真器或物理设备)

对于中小型文件,一切正常,但是当我尝试发送大于10Mb的内容时,服务器永远不会到达此语句out2.println("ready");,因此客户端挂起了"ready"从服务器的等待,
似乎服务器卡在了这里:os.write(bytearray, 0, bytearray.length);

到目前为止,我已经在模拟器上进行了尝试,我将在不久的将来在真实设备上报告结果

这是我在Android应用程序中的客户端部分:Android客户端向服务器发送“下载”字符串,然后从服务器接收“就绪”回复,并开始从InputStream读取文件

int filesize = 2022386;
int bytesRead;
int currentTot = 0;

Socket socket1 = new Socket("172.16.6.119", 50001); //data line
Socket socket2 = new Socket("172.16.6.119", 50001); //control line

BufferedReader in2 = new BufferedReader(new InputStreamReader(socket2.getInputStream()));  
PrintWriter out2 = new PrintWriter(socket2.getOutputStream(), true);

out2.println("download:"); //control line

String usrtxt = in2.readLine();

if(usrtxt.substring(0,5).equals("ready")) //control line
                {
                    byte [] bytearray = new byte [filesize];

                    InputStream is = socket1.getInputStream(); //data line
                    FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "/sunset.jpg");
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    bytesRead = is.read(bytearray,0,bytearray.length);
                    currentTot = bytesRead;

                    Log.e("DOWNLOAD", "init value: bytesread = " + Integer.toString(bytesRead));

                    do {
                    bytesRead =
                    is.read(bytearray, currentTot, (bytearray.length-currentTot)); //<--does not pull data (WHY?)

                    Log.e("DOWNLOAD", "bytesread = " + Integer.toString(bytesRead));

                    if(bytesRead >= 0) currentTot += bytesRead;
                    } while(bytesRead > -1);

                    out1.println("finished:");

                    bos.write(bytearray, 0 , currentTot);

                    Log.e("DOWNLOAD", Integer.toString(currentTot));
                    bos.flush();
                    bos.close();
                    socket1.close(); socket2.close();       

                }

这是我的服务器代码:它接受来自客户端的连接,然后从客户端接收“下载”字符串,回复“就绪”,然后将文件放入OutputStream

while (true) {

                final Socket socket = serverSocket.accept();  //data line
                final Socket socket2= serverSocket.accept();  //control line          

                BufferedReader in2 = new BufferedReader(new InputStreamReader(socket2.getInputStream()));  
                PrintWriter out2 = new PrintWriter(socket2.getOutputStream(), true);

                String usrtxt = in2.readLine(); //control line

                if(usrtxt.substring(0,8).equals("download"))
                {
                System.out.println("accepted download request. sending file");  

                File transferFile = new File("sunset.jpg"); 

                byte[] bytearray = new byte[(int)transferFile.length()];
                FileInputStream fin = new FileInputStream(transferFile);
                BufferedInputStream bin = new BufferedInputStream(fin);
                bin.read(bytearray, 0, bytearray.length);

                OutputStream os = socket.getOutputStream();
                os.write(bytearray, 0, bytearray.length); //data line


                os.flush();
                os.close();

                out2.println("ready"); //control line


                socket.close(); socket2.close();
                bin.close(); fin.close();


                System.out.println("file transfer complete");

                }//end if           

            }//end while
用户名

这是无法复制流的方法。它假定了太多可能不正确的事情。

Java中的规范方法如下:

byte[] buffer = new byte[8192];  // or whatever you like, anything above zero. Note that it doesn't have to be the size of the file
int count;
while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

如果您事先知道了长度,并且想在以后保持套接字打开状态,请通过“ total + = count;”跟踪到目前为止已传输的字节数。在循环内的read调用之后,将read调用更改为read(buffer, 0, length-total > buffer.length ? buffer.length : (int)(length-total))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章