当前位置: 首页 > 知识库问答 >
问题:

HttpURLConnection的getOutputStream引发异常

蔚弘量
2023-03-14

我使用HttpURLConnection将大文件(高达160MB)上传到服务器。有一个奇怪的异常随机出现。这是代码。

我录制一个视频文件(最多5分钟)。然后上传它,我启动一个intentService。它使用HttpURLConnection。这是我如何启动HttpURLConnection。

try {
        URL url=new URL(getString(postUrlResId));
        httpURLConnection = (HttpURLConnection) url.openConnection();
        httpURLConnection.setDoInput(true);
        httpURLConnection.setDoOutput(true);
        httpURLConnection.setConnectTimeout(60000);
        //httpURLConnection.setUseCaches(false);
        httpURLConnection.setFixedLengthStreamingMode(postLength);
        httpURLConnection.setRequestMethod("POST");
        //httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
        //httpURLConnection.setRequestProperty("Cache-Control", "no-cache");
        httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=*****");
        dataOutputStream = new DataOutputStream(httpURLConnection.getOutputStream());
        dataOutputStream.writeBytes(header);

            -----------
            ----file writting to dataOutputStream 
            ---------

}

        dataOutputStream.writeBytes(footer);
        RESPONSE_UPLOAD_VIDEO_BEING_PROCESSED_IN_SERVER();
        if(httpURLConnection.getResponseCode() == 200 && httpURLConnection.getResponseMessage().equalsIgnoreCase("OK")) {
            BufferedReader bufferReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
            StringBuffer serverRes = new StringBuffer();
            String inputLine ;
            while ((inputLine = bufferReader.readLine()) != null) 
            {
                serverRes.append(inputLine);
            }
            PRINT_LOG(serverRes.toString());
            RESPONSE_UPLOAD_COMPLETE(serverRes.toString());

        }else {
            RESPONSE_ERROR();
        }   


    } catch (MalformedURLException e) {
        e.printStackTrace();
        PRINT_ERROR(" MalformedURLException. ");
        RESPONSE_ERROR();
    } catch (IOException e) {
        e.printStackTrace();
        PRINT_ERROR(" IOException. may be no internet connection ");
        RESPONSE_ERROR();
    } finally {

        if (httpURLConnection != null) {
            httpURLConnection.disconnect();
        }
        if (dataOutputStream != null) {
            try {
                dataOutputStream.flush();
                dataOutputStream.close();  
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

现在,这个调用“http pURLConnection.get输出流()”有时会抛出这个异常:

03-13 15:50:23.088:W/系统。err(27349):java。网SocketException:sendto失败:EconReset(对等方重置连接)03-13 15:50:23.088:W/系统。err(27349):在libcore。伊奥。伊奥布里奇。MaybethrowAfterEndto(IoBridge.java:506)03-13 15:50:23.088:W/System。err(27349):在libcore。伊奥。伊奥布里奇。sendto(IoBridge.java:475)03-13 15:50:23.088:W/System。err(27349):在爪哇。网普通袜子。write(PlainSocketImpl.java:507)03-13 15:50:23.088:W/System。err(27349):在爪哇。网普通袜子。访问$100(PlainSocketImpl.java:46)03-13 15:50:23.093:W/System。err(27349):在java。网PlainSocketImpl$PlainSocketOutputStream。write(PlainSocketImpl.java:269)03-13 15:50:23.093:W/System。err(27349):在爪哇。伊奥。输出流。write(OutputStream.java:82)03-13 15:50:23.093:W/System。err(27349):在libcore。网http。HttpEngine。writeRequestHeaders(HttpEngine.java:646)03-13 15:50:23.093:W/System。err(27349):在libcore。网http。HttpEngine。initRequestBodyOut(HttpEngine.java:346)03-13 15:50:23.093:W/System。err(27349):在libcore。网http。HttpEngine。sendSocketRequest(HttpEngine.java:301)03-13 15:50:23.093:W/System。err(27349):在libcore。网http。HttpEngine。sendRequest(HttpEngine.java:239)03-13 15:50:23.093:W/System。err(27349):在libcore。网http。HttpURLConnectionImpl。连接(HttpURLConnectionImpl.java:80)03-13 15:50:23.093:W/System。err(27349):在com。卡拉OK。服务上传服务。onHandleIntent(UploadService.java:145)03-13 15:50:23.093:W/System。呃(27349):在android上。应用程序。IntentService$ServiceHandler。handleMessage(IntentService.java:65)03-13 15:50:23.093:W/System。呃(27349):在android上。操作系统。汉德勒。dispatchMessage(Handler.java:99)03-13 15:50:23.093:W/System。呃(27349):在android上。操作系统。活套。loop(Looper.java:137)03-13 15:50:23.093:W/System。呃(27349):在android上。操作系统。手绢。运行(HandlerThread.java:60)03-13 15:50:23.098:W/System。错误(27349):由libcore引起。伊奥。ErrnoException:sendto失败:EconReset(对等方重置连接)03-13 15:50:23.098:W/系统。err(27349):在libcore。伊奥。Posix。发送字节(本机方法)03-13 15:50:23.098:W/系统。err(27349):在libcore。伊奥。Posix。sendto(Posix.java:146)03-13 15:50:23.098:W/System。err(27349):在libcore。伊奥。布洛克瓜多斯。sendto(BlockGuardOs.java:177)03-13 15:50:23.098:W/System。err(27349):在libcore。伊奥。伊奥布里奇。sendto(IoBridge.java:473)

大多数情况下,这通常发生在我第一次启动上传服务时。但这种情况是随机发生的。一旦抛出此异常,如果使用相同的参数再次启动服务,它就可以正常工作。文件越大,异常的发生率越高。我还注意到,这种问题在三星设备中出现的频率更高,我试过使用htc evo 3d,nexus 5也试过。似乎找不到任何理由来解释这样的问题。在网上找不到类似的问题。

更新:所以我不知道为什么会出现这个错误,但是当我把我的基本网址从域名网址切换到基于ip的网址时,它一直工作得很好。

共有1个答案

臧翰采
2023-03-14
httpURLConnection.disconnect();
httpURLConnection.connect();

我完全不知道你究竟为什么要调用这两种方法,但我建议删除这两行代码可以解决这个问题。

 类似资料:
  • 我尝试使用HttpUrlConnection使我的应用程序与我的php服务器通信。我写了一个在我的电脑上运行良好的类,但当我在手机上执行它时,它根本不起作用。 这是我的代码: DataOutputStream out=新的DataOutputStream(connection.getOutputStream());引发此异常: 我在电脑上测试了这段代码,它没有引发任何异常。我的清单: 谢谢

  • 问题内容: 我想使用HttpURLConnection进行POST。我以两种方式尝试这种方法,但是这样做总是让我兴奋不已: 我在这两种情况下得到的异常是: java.net.SocketException:操作超时:connect:可能是由于无效的地址 功能1: 或功能2: 问题答案: 根本无法访问该URL。URL错误或DNS服务器无法解析主机名。尝试使用众所周知的URL进行简单连接以排除一个和另

  • 我试图使用android HttpUrlConnection进行POST请求。首先,我从这里使用GET请求的示例: http://developer.android.com/training/basics/network-ops/connecting.html#http-客户 它工作得非常好(例如,我得到了google.com页面)。然后我做了一些更改以发出POST请求:更改POST上的请求方法:

  • 你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。 如何引发异常 例13.2 如何引发异常 #!/usr/bin/python # Filename: raising.py classShortInputException(Exception):     '''A u

  • 我在写一个apk分析程序。我不能深入细节,因为这是研究材料。然而,重点在于,当我执行分析例程时,不时会得到以下消息: 这只是主要代码。我必须执行三个主要操作。为了不泄露特定信息,我把它们重新命名为A、B、C 我将这个问题标记为multithread,因为在多线程版本中也会发生同样的情况,为了调试错误,我使用此代码对该版本进行了序列化。请注意,NullPointerException位于线程主线程中

  • 问题内容: 鉴于此Java 8代码 我们如何正确地将其委派给方法调用的堆栈?(简而言之,如何使此方法抛出此错误?) Java中的Lambda看起来对错误处理不是很友好… 问题答案: 我的方法是从lambda 偷偷地 将其抛出,但是要小心,使该方法在其子句中声明它。使用我在这里发布的课程: 这样,您可以有效地使编译器仅“移开视线”,从而在代码中的某个位置禁用其异常检查,但是通过在方法中声明异常,可以