Java 在Android AsyncTask中获取StreamCorruptedException

Java 在Android AsyncTask中获取StreamCorruptedException,java,android,android-asynctask,Java,Android,Android Asynctask,我正在实现一个与Servlet交互的异步任务。我得到一个证书和一个挑战ChallengeMessage,我回答这个挑战,然后我得到一个验证答案字符串 我不知道为什么当我将ChallengeMessage发送到servlet时会出现StreamCorrupted异常,这是我在代码中唯一执行的writeObject。这是我的基本方法 我知道这不是你见过的最好的代码,这只是一些快速测试 protected String doInBackground(Object... params) { t

我正在实现一个与Servlet交互的异步任务。我得到一个证书和一个挑战ChallengeMessage,我回答这个挑战,然后我得到一个验证答案字符串

我不知道为什么当我将ChallengeMessage发送到servlet时会出现StreamCorrupted异常,这是我在代码中唯一执行的writeObject。这是我的基本方法

我知道这不是你见过的最好的代码,这只是一些快速测试

protected String doInBackground(Object... params) {

    try {           

        URL url = new URL("ValidURL");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        Log.i("URL", "VERIFIER CREATED");

        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestMethod("PUT");

        ObjectOutputStream out = new ObjectOutputStream(connection.getOutputStream());
        ObjectInputStream in = new ObjectInputStream(connection.getInputStream());
        Log.i("STREAM", "STREAMS CREATED");            

        //Receive CA certificate + challenge
        ChallengeMessage challenge = (ChallengeMessage) in.readObject();
        certificateCA = challenge.getCertificate();
        byte[] nonce = challenge.getNonce();
        //Log.i("Nonce", nonce.toString());

        //Hash challenge and send back with user certificate
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] hashedNonce = md.digest(nonce);
        //Log.i("Digest", hashedNonce.toString());

        ChallengeMessage challengeResponse = new ChallengeMessage(hashedNonce, (X509Certificate)params[1]);           
        out.writeObject(challengeResponse); //Here I get the StreamCorruptedException
        out.flush();            

        String mResp = (String) in.readObject();
        Log.i("ANSWER",mResp);            

        in.close();
        out.close();
        connection.disconnect();

        return mResp;

    } catch(ProtocolException e) {
        Log.i("VERIFIER", e.toString());
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();        
    }

    return "False";
}
这是StackTrace

    08-22 12:43:23.764: W/System.err(30506): java.io.StreamCorruptedException
08-22 12:43:23.774: W/System.err(30506):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1528)
08-22 12:43:23.774: W/System.err(30506):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
08-22 12:43:23.774: W/System.err(30506):    at cat.urv.tfg.tasks.VerifyCredentialsTask.doInBackground(VerifyCredentialsTask.java:76)
08-22 12:43:23.774: W/System.err(30506):    at cat.urv.tfg.tasks.VerifyCredentialsTask.doInBackground(VerifyCredentialsTask.java:1)
08-22 12:43:23.774: W/System.err(30506):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
08-22 12:43:23.774: W/System.err(30506):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-22 12:43:23.774: W/System.err(30506):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-22 12:43:23.774: W/System.err(30506):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-22 12:43:23.774: W/System.err(30506):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-22 12:43:23.784: W/System.err(30506):    at java.lang.Thread.run(Thread.java:841)

发布准确的错误消息和堆栈跟踪。很难相信。确定它没有被抛出readObject?当然,我记录了它,结果是预期的结果。但是,它在readObject语句中崩溃了。我是说writeObject,对于EJP的评论,抱歉+1。即使您通过了writeObject,您也会在readObject上得到StreamCorruptedException,因为您没有先调用out.close。