Android: java.lang.IllegalStateException: Already connected

Saint Robson picture Saint Robson · Jan 19, 2014 · Viewed 13.2k times · Source

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.

Answer

user207421 picture user207421 · Jul 5, 2016
  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.