0

HttpPost 呼び出しを行っているときに Android プロジェクトで例外がキャッチされ、その理由がわかりません。ネットワーク呼び出しを行うメソッドの開始は次のとおりです。

try {


        this.httpClient = new DefaultHttpClient();
        httpPost = new HttpPost(url);

        if (json != null && json != "") {
            httpPost.setEntity(new ByteArrayEntity(json.getBytes("UTF8")));
            httpPost.setHeader("Content-type", "application/json");
            if(token!=null) {
                //httpPost.setHeader("Authorization", "Basic VEU5SFNVNWZWRmxRUlY5RFZWTlVUMDFGVWpwcWFXMXRlV1JoWjJobGNrQm5iV0ZwYkM1amIyMDZNVEV4TVE9PQ==");
                httpPost.setHeader("Authorization", "Basic " + token);
            }
        }



        HttpParams httpParameters = new BasicHttpParams();
        // Set the timeout in milliseconds until a connection is established.
        // The default value is zero, that means the timeout is not used. 
        int timeoutConnection = 15000;
        HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
        // Set the default socket timeout (SO_TIMEOUT) 
        // in milliseconds which is the timeout for waiting for data.
        int timeoutSocket = 15000;
        HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
        httpClient.setParams(httpParameters);


        httpResponse = httpClient.execute(httpPost);

最後の行は、例外がキャッチされる行です。exception.getMessage() をログアウトしようとしましたが、null です。スタック バックトレースは次のとおりです。

java.net.PlainSocketImpl.read(PlainSocketImpl.java:492)
java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:241)
org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191)
org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82)
org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)
org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:180)
org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)
org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)
org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)
org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:428)
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
com.arcmobileapp.web.WebServices.getResponse(WebServices.java:106)
com.arcmobileapp.web.WebServices.createReview(WebServices.java:601)
com.arcmobileapp.web.SubmitReviewTask.performTask(SubmitReviewTask.java:59)
com.arcmobileapp.web.SubmitReviewTask.doInBackground(SubmitReviewTask.java:47)
com.arcmobileapp.web.SubmitReviewTask.doInBackground(SubmitReviewTask.java:1)
android.os.AsyncTask$2.call(AsyncTask.java:287)
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
java.util.concurrent.FutureTask.run(FutureTask.java:137)
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
java.lang.Thread.run(Thread.java:856)

何が例外を引き起こしているのでしょうか? 毎回発生するわけではなく、断続的に発生するようです (ネットワーク?)。

前もって感謝します。

4

2 に答える 2

1

java.net.PlainSocketImpl通常、この例外は、接続しようとしているポートでリッスンしているサービスがない場合に発生します。

以下の3点を再確認してください

1) 接続しようとしているホスト名とポート。

2) サーバー側は、リッスンを正しく開始することができました。

3) 接続をブロックするファイアウォールはありません。

于 2013-10-20T15:21:18.773 に答える
0

このコードをテストします。

public class HttpConnectionTask
{
    public static final int RESPONSE_OK = 0;
    public static final int RESPONSE_ERROR = 1;    

    private String body = null;
    private String strUrl;
    private int responsCode;
    private List<NameValuePair> postData = null;

    public HttpConnectionTask(String strUrl)
    {
        this.strUrl = strUrl;
    } 

    public HttpConnectionTask(String strUrl, List<NameValuePair> postData)
    {
        this.strUrl = strUrl;
        this.postData = postData;
    } 

    public void run() 
    {               
        try
        {           
            this.responsCode = RESPONSE_OK;

            HttpClient client = new DefaultHttpClient(); 
            HttpResponse response = null;

            if(this.postData == null)
            {
                HttpGet get = new HttpGet(this.strUrl);             
                response = client.execute(get); 
            }
            else
            {
                HttpPost postMethod = new HttpPost(this.strUrl);
                postMethod.setEntity(new UrlEncodedFormEntity(this.postData, "UTF-8"));
                response = client.execute(postMethod);
            }

            // Get the response
            BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

            this.body = "";

            char[] dataChunk = new char[1024];            
            StringBuffer dataBuffer = new StringBuffer();

            int readSize = 0;

            while((readSize = rd.read(dataChunk)) >= 0)
            {                
                dataBuffer.append(dataChunk, 0, readSize);                
            }

            this.body = dataBuffer.toString().trim();                       
        }        
        catch (Exception ex)
        {            
            this.responsCode = RESPONSE_ERROR;
        }                                               
    }

    public String getBody()
    {
        return this.body;
    }

    public int getResponse()
    {
        return this.responsCode;
    }
}

このクラスを使用します:

String url = "Your url" + "?exam1=1"; //for get data                                                    

List<NameValuePair> postData = new ArrayList<NameValuePair>();          
postData.add(new BasicNameValuePair("test1", "123")); //for post data
postData.add(new BasicNameValuePair("test2", "456")); //for post data

HttpConnectionTask httpPost = new HttpConnectionTask(url, postData);
httpPost.run();
于 2013-10-20T15:48:34.840 に答える