Android - HttpPost выдает SocketException: сокет закрыт

У меня есть простая форма входа, которая просто использует HttpPost для подключения к серверу и получения некоторых данных. Он отлично работает на эмуляторе, но на устройстве выдает java.net.SocketException: Socket closed. Буду признателен за любую помощь в том, что может пойти не так.

  • Если я использую HttpGet (и меняю серверную сторону на получение GET), все работает нормально.
  • Разрешение INTERNET включено в манифест
  • url и nameValuePairs передаются из метода doInBackground (AsyncTask).
  • Нет проблем с URL-адресом (работает в браузере или эмуляторе, как и ожидалось)
  • Это не локальный хост
  • И эмулятор, и устройство используют API 10.

Эта строка вызывает проблему: HttpResponse response = httpclient.execute(httppost);

  • Возможно ли, что устройство как-то вызывает проблему? (на другом устройстве не проверял)
  • Есть ли альтернатива org.apache.http.client.methods.HttpPost для публикации данных?

Пожалуйста, дайте мне знать, если требуется дополнительная информация. Спасибо за ваше время

Метод:

static HttpClient httpclient = new DefaultHttpClient();

public static String postRequest(String url, List<NameValuePair> nameValuePairs)
{
    String resp = "";
    HttpPost httppost = new HttpPost(url);

    try {
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);
        resp = IS2S.inputStreamToString(response.getEntity().getContent());
    }
    catch (ClientProtocolException e) {}
    catch (IOException e) {
        Log.e("666---" , e.getMessage());
           e.printStackTrace();
    }
    return resp;
}

Трассировки стека:

java.net.SocketException: Socket closed
    at org.apache.harmony.luni.platform.OSNetworkSystem.read(Native Method)
    at dalvik.system.BlockGuard$WrappedNetworkSystem.read(BlockGuard.java:273)
    at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:458)
    at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:85)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191)
    at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)
    at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179)
    at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)
    at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:421)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:580)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:512)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:490)

person Samurai    schedule 05.09.2013    source источник


Ответы (1)


используйте flush() для каждого сообщения без закрытия. А также использовать только один выходной поток.

person shiju B    schedule 10.10.2013