Android: java.lang.IllegalStateException: уже подключен

Я тестирую образец кода, но его всегда ошибка в 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); 

Журнал ошибок: java.lang.IllegalStateException: Already connected . Я пробовал это, но никто не работает:

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

EDIT: даже когда я не вызывал connection.connect() , он все еще дает ту же самую ошибку, которая already connected .

  1. Вы должны закрыть входной поток после прочтения его до конца потока.

  2. Вы должны удалить вызов connect() . У вас это не в том месте, но оно автоматическое и вообще не нужно называть.

  3. Вы также можете удалить строку, которая устанавливает POST. Это подразумевается при вызове setDoOutput(true) .

  4. Вы также можете удалить большую часть этого crud в цикле копирования. Используйте буфер фиксированного размера:

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

    Не используйте новый буфер для каждого чтения; Не вызывать available() ; Не проходите GO; Не собирайте 200 долларов.

Переехать

 connection.connect(); 

после

 connection.setRequestMethod("POST"); 

Существует очень хорошая публикация о http-соединениях здесь

Суть в том, что для POST вам нужно только следующее.

 HttpURLConnection connection = (HttpURLConnection) new URL(urlToRead).openConnection(); // setDoOutput(true) implicitly set's the request type to POST connection.setDoOutput(true); 

Я не уверен, что вам нужно указать HttpsURLConnection. Вы можете использовать HttpURLConnection для подключения к сайтам Https. Пусть java сделает за вас работу за кулисами.

Вот код POST, который я использую для сообщений json

 public static String doPostSync(final String urlToRead, final String content) throws IOException { final String charset = "UTF-8"; // Create the connection HttpURLConnection connection = (HttpURLConnection) new URL(urlToRead).openConnection(); // setDoOutput(true) implicitly set's the request type to POST connection.setDoOutput(true); connection.setRequestProperty("Accept-Charset", charset); connection.setRequestProperty("Content-type", "application/json"); // Write to the connection OutputStream output = connection.getOutputStream(); output.write(content.getBytes(charset)); output.close(); // Check the error stream first, if this is null then there have been no issues with the request InputStream inputStream = connection.getErrorStream(); if (inputStream == null) inputStream = connection.getInputStream(); // Read everything from our stream BufferedReader responseReader = new BufferedReader(new InputStreamReader(inputStream, charset)); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = responseReader.readLine()) != null) { response.append(inputLine); } responseReader.close(); return response.toString(); } 

Добавить

 if (connection != null) connection.disconnect(); 

до

 connection = (HttpsURLConnection) url.openConnection(); 

Посмотрите, не решена ли проблема. Если да, значит, connection.disconnect() не вызывается в вашем исходном коде. Возможно, вы положили connection.disconnect() в конце блока try , однако перед ним возникает исключение, поэтому оно переходит к блоку catch, а connection.disconnect() никогда не вызывается.

Intereting Posts
Как передать Bluetooth-сокет другому действию с использованием интерфейса приложения Как обмениваться изображениями с моим приложением в whatsapp? Помощник менеджера уведомлений Android Проверка подписки на сообщение о покупке приложения для Android в Python в Google App Engine Сделать привязку ViewPager с более коротким перетаскиванием Несовместимые плагины для android-apt после обновления до Android Studio 2.3 Как использовать функцию bulkInsert () в android? Ошибка при запуске Android Studio 2.1 Создание SDL для ARM с использованием автономной инструментальной привязки Android Текст кнопки не центрируется Android AltBeacon Фоновая служба Ranging Ошибка сборки Gradle в Android Studio Клавиатура Android скрывает себя, показывая пустое место внизу, после возвращения из заставки Google MapView не работает после подписания приложения. Каков наиболее эффективный способ хранения длинного списка объектов в царстве?