![](/img/trans.png)
[英]Java, FileNotfound Exception, While reading conn.getInputStream()
[英]Send POST request and read response. IOException when conn.getInputStream()
我到處搜索,無法解決我的問題。 我有AsyncTask,在doInBackground中,我有:
protected Void doInBackground(byte[]... params) {
try {
URL url = new URL(stringURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// Allow Inputs
conn.setDoInput(true);
// Allow Outputs
conn.setDoOutput(true);
// Don't use a cached copy.
onn.setUseCaches(false);
// Use a post method.
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "text/html; charset=UTF-8");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Accept", "text/html");
conn.setRequestProperty("Content-Length", params[0].length);
OutputStream out = conn.getOutputStream();
out.write(params[0]);
out.flush();
out.close();
InputStream is = conn.getInputStream();
int ch;
StringBuffer b =new StringBuffer();
while( ( ch = is.read() ) != -1 ){
b.append( (char)ch );
}
String s = b.toString();
}catch (IOException e) {
e.printStackTrace();
}
我這樣稱呼我的異步任務: new httpRequestResponseTask().execute(byteArray);
每當我成功發送請求時,嘗試讀取響應后,都會得到java.io.IOException: unexpected end of stream on Connection...
當我調用conn.getInputStream()
時java.io.IOException: unexpected end of stream on Connection...
conn.getInputStream()
java.io.IOException: unexpected end of stream on Connection...
。 當我調用conn.getResponseCode()
和conn.getResponseMessage()
時,會遇到相同的異常。
我可以看到服務器收到了我的請求並成功發送了響應 。 但是我不明白。
我嘗試了許多想法(其中有些瘋狂)只是為了測試:
*我把conn.connect();
設置屬性后-相同的IOexception
*不關閉OutputStream-相同的IOexception
*增加像
conn.setReadTimeout(30000);
conn.setConnectTimeout(35000);
響應應該是57個字節,所以超時就足夠了。 沒變。
*我嘗試使用url.OpenStream()獲取InputStream。 它只是掛了,什么也沒發生。
*我嘗試使用其他屬性(如Accept-Encoding
和較少的Properties。
*我檢查了網址,其中沒有空格。 網址是這樣的: http://example.com:8080
: http://example.com:8080
: http://example.com:8080
。
我沒有代理人。 我將個人電話用作Wi-Fi熱點,並使用工作電話測試該程序。 與android 6.0一起使用,但項目設置為4.4 kitkat。
我應該以某種方式等待還是做其他事情? 我沒主意...
更新例外堆棧
沒有內容長度
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err: java.io.IOException: unexpected end of stream on Connection{example.com:8080, proxy=DIRECT@ hostAddress=*.*.*.* cipherSuite=none protocol=http/1.1} (recycle count=0)
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err: at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:210)
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err: at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80)
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err: at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:918)
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err: at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:802)
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:460)
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405)
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231)
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: at com.xmltestservers.MainActivity$RetrieveFeedTask.doInBackground(MainActivity.java:172)
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: at com.xmltestservers.MainActivity$RetrieveFeedTask.doInBackground(MainActivity.java:125)
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295)
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: at java.lang.Thread.run(Thread.java:818)
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: Caused by: java.io.EOFException: \n not found: size=0 content=...
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:200)
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191)
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: ... 14 more
具有內容長度
12-21 14:40:42.783 7729-7837/com.xmltestservers W/System.err: java.io.IOException: unexpected end of stream on Connection{example.com:8080, proxy=DIRECT@ hostAddress=*.*.*.* cipherSuite=none protocol=http/1.1} (recycle count=0)
12-21 14:40:42.784 7729-7837/com.xmltestservers W/System.err: at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:210)
12-21 14:40:42.785 7729-7837/com.xmltestservers W/System.err: at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80)
12-21 14:40:42.785 7729-7837/com.xmltestservers W/System.err: at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:918)
12-21 14:40:42.785 7729-7837/com.xmltestservers W/System.err: at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:802)
12-21 14:40:42.786 7729-7837/com.xmltestservers W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:460)
12-21 14:40:42.786 7729-7837/com.xmltestservers W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405)
12-21 14:40:42.786 7729-7837/com.xmltestservers W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231)
12-21 14:40:42.786 7729-7837/com.xmltestservers W/System.err: at com.xmltestservers.MainActivity$RetrieveFeedTask.doInBackground(MainActivity.java:169)
12-21 14:40:42.786 7729-7837/com.xmltestservers W/System.err: at com.xmltestservers.MainActivity$RetrieveFeedTask.doInBackground(MainActivity.java:125)
12-21 14:40:42.787 7729-7837/com.xmltestservers W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295)
12-21 14:40:42.787 7729-7837/com.xmltestservers W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
12-21 14:40:42.787 7729-7837/com.xmltestservers W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
12-21 14:40:42.787 7729-7837/com.xmltestservers W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
12-21 14:40:42.788 7729-7837/com.xmltestservers W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
12-21 14:40:42.788 7729-7837/com.xmltestservers W/System.err: at java.lang.Thread.run(Thread.java:818)
12-21 14:40:42.788 7729-7837/com.xmltestservers W/System.err: Caused by: java.io.EOFException: \n not found: size=57 content=f1f1f1340079c1eed5d9043324501c4ae6700647e093ea8a18b2e42c9d2acbd8...
12-21 14:40:42.789 7729-7837/com.xmltestservers W/System.err: at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:200)
12-21 14:40:42.790 7729-7837/com.xmltestservers W/System.err: at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191)
12-21 14:40:42.790 7729-7837/com.xmltestservers W/System.err: ... 14 more
嘗試此代碼以讀取響應
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
事實證明,響應沒有任何標題,我認為這是問題所在。 我用HTTPClient
嘗試了HTTPClient
,但沒有響應,因為響應中沒有標頭(我認為異常不是有效的HTTP響應)。 之后,我嘗試使用Socket
並成功了。 這是代碼:
Socket socket = new Socket(url.getHost(), url.getPort());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write(hardcodedRequest);
out.flush();
InputStream inStream = socket.getInputStream();
byte[] resp = new byte[hardcodedResponse.length];
int res = inStream.read(resp);
//Check if the response is the correct one.
if (!Arrays.equals(resp, hardcodedResponse) && res != hardcodedResponse.length) {
}
out.close();
我知道響應的支持是什么,因此我對其進行了硬編碼,並將其與服務器的響應進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.