Samira Radwan Ответов: 1

Не получает httpurlconnection.getinputstream()


Всем Привет,

Я пытаюсь отправить/опубликовать двоичный файл на локальный сервер с помощью java HttpURLConnection и все, кажется, работает нормально. Сервер получает файл, который я могу видеть.

Проблема в том, что я не получаю ответа, который должен был бы получить. При загрузке файла с html страницы браузер показывает ответ следующим образом:

HTTP/1.0 200 OK

<html><body>it 123 will reboot in 5 seconds</body></h<html><body>it 123 will reboot in 5 seconds</body></h<html><body>it 123 will reboot in 5 seconds</body></h<html><body>it 123 will reboot in 5 seconds</body></h<html><body>it 123 will reboot in 5 seconds</body></h<html><body>it 123 will reboot in 5 seconds</body></h


В моем случае и при использовании android studio/java приложение зависает на этой строке без сообщения об ошибке:
InputStream responseStream = new BufferedInputStream(httpURLConnection.getInputStream());

Если я закомментирую часть ответа, то все будет в порядке. Интересно, мой код неверен или с сервером что-то не так? Я даже попытался усыпить нить на 10 секунд после отправки, но безуспешно. Пожалуйста, дайте мне знать, если моя логика неверна, или любые предложения будут очень оценены.

Насколько мне известно, это единственный способ, чтобы написать ответ, используя HttpURLConnection пост.

Спасибо!

Что я уже пробовал:

new Thread(new Runnable() {
    @Override
    public void run() {
	
        DataOutputStream dataOutputStream;
        byte[] data = new byte[(int) myFile.length()];
        String boundary = "---------------------"  + System.currentTimeMillis();

        try{
            DataInputStream dataInputStream = new DataInputStream(new FileInputStream(myFile));
            dataInputStream.readFully(data);
            dataInputStream.close();
            Log.d("[send File]","file length: " + data.length);

            String url = "http://example.com";
            URL serverURL = new URL(url);
            HttpURLConnection httpURLConnection = (HttpURLConnection)serverURL.openConnection();
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            httpURLConnection.setUseCaches(false);
            httpURLConnection.setFixedLengthStreamingMode(data.length);
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setRequestProperty("Content-Type", "MultiPart/Form-Data; charset=UTF-8");
            httpURLConnection.setRequestProperty("boundary=",boundary);

            dataOutputStream = new DataOutputStream(httpURLConnection.getOutputStream());
            Log.d("[send File]","trying to read the response1");
            dataOutputStream.write(data);
            dataOutputStream.flush();
            dataOutputStream.close();
            Log.d("[send File]","trying to read the response2 --");



            //response from the server
            InputStream responseStream = new BufferedInputStream(httpURLConnection.getInputStream());
            Log.d("[send File]","trying to read InputStream");
            BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream,"UTF-8"));
            if(responseStreamReader.ready()){
                String response;
                StringBuilder stringBuilder = new StringBuilder();
                Log.d("[send File]","trying to read the response");
                while((response = responseStreamReader.readLine()) != null){
                    stringBuilder.append(response).append("\n");
                }
            }else{
                Log.d("[send File]","BufferedReader is null");
            }

            responseStream.close();

            Log.d("[send File]","closing the connection ...");
            httpURLConnection.disconnect();


        }catch(Exception ex){
            ex.printStackTrace();
        }

    }
}).start();

David Crow

Вы говорите, что файл отправляется на сервер, но затем говорите, что код "замораживается" при построении файла. DataOutputStream объект. Как это происходит с момента звонка в dataOutputStream.write(data) происходит после того, как DataOutputStream объект построен?

Samira Radwan

@David Crow, это была опечатка, моя ошибка, она действительно зависает после отправки файла и попытки получить ответ, сначала построив "входной поток". Я обновил свой вопрос

Richard MacCutchan

Текст этого ответа выглядит искаженным. Может быть, это проблема сервера.

1 Ответов

Рейтинг:
2

Chad3F

Вы пробовали удалить его BufferedInputStream()? Если сервер еще не закрыл поток, он все еще может ждать буферизации большего количества данных (или достижения EOF, что никогда не происходит). Основываясь на вашем заданном ожидаемом выходе, я не был уверен, что вы случайно вставили несколько раз или сервер "толкает" контент (что заставило бы его держать поток открытым до тех пор, пока он не будет завершен, если вообще когда-либо).