我正在实现一个与Servlet交互的AsyncTask。我得到了证书和挑战(ChallengeMessage),我回答了这个挑战,然后我得到了一个验证答案(字符串)。
当我将ChallengeMessage发送到servlet(我在代码中执行的唯一writeObject())时,我不知道为什么会出现StreamCorrupted异常。这是我的doInBackground方法。
我知道这不是你见过的最好的代码,这只是一些快速测试。
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)