Android: java.lang.IllegalStateException: Already connected

13,422
  1. You must close the input stream after reading it to end of stream.

  2. You should remove the call to connect(). You have it in the wrong place, but it's automatic and doesn't need to be called at all.

  3. You can also remove the line that sets POST. This is implicit in calling setDoOutput(true).

  4. You can also remove most of that crud in the copy loop. Use a fixed size buffer:

    while ((count = in.read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }
    

    Do not use a new buffer per read; do not call available(); do not pass GO; do not collect $200.

Share:
13,422
Saint Robson
Author by

Saint Robson

Updated on June 17, 2022

Comments

  • Saint Robson
    Saint Robson almost 2 years

    I'm testing a sample of code but its always error at connection.setDoInput(true);

    HttpsURLConnection connection = null;
    DataOutputStream outputStream = null;
    DataInputStream inputStream = null;
    
    String urlServer = "https://www.myurl.com/upload.php";
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    
    int bytesRead = 0;
    int bytesAvailable = 0;
    int bufferSize = 0;
    byte[] buffer = null;
    int maxBufferSize = 1*1024*1024;
    
    try {
        FileInputStream fileInputStream = new FileInputStream(new File(params[0]));
    
        URL url = new URL(urlServer);
    
        connection = (HttpsURLConnection) url.openConnection();
        connection.setConnectTimeout(1000);
    
        // Allow Inputs & Outputs
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setUseCaches(false);
    
        // Enable POST method
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
    
        connection.setConnectTimeout(1000);
    
        outputStream = new DataOutputStream(connection.getOutputStream());
        outputStream.writeBytes(twoHyphens + boundary + lineEnd);
        outputStream.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\"" + params[0] + "\"" + lineEnd);
        outputStream.writeBytes(lineEnd);
    
        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        buffer = new byte[bufferSize];
    
        // Read file
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
    
        while (bytesRead > 0) {
            outputStream.write(buffer, 0, bufferSize);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        }
    
        outputStream.writeBytes(lineEnd);
        outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
    

    The error log is java.lang.IllegalStateException: Already connected. I have tried these but none is working:

    connection.setRequestProperty("Connection", "close");
    connection.disconnect();
    connection.setConnectTimeout(1000);
    

    EDIT: even when i didn't call connection.connect(), it's still giving the same error already connected.