1

同様の質問を見ましたが、答えが見つかりませんでした。ksoap2 ライブラリを使用して Web サーバーに接続していますが、例外 java.net.SocketTimeoutException: read timed out が発生することがあります。

これが私のコードです:

    SoapObject request = new SoapObject(NAMESPACE, method);

    if (properties != null) {
        for (PropertyInfo property : properties) {
            request.addProperty(property);
        }
    }

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.setOutputSoapObject(request);;

    HttpsTransportSE transport = new HttpsTransportSE(HOST, PORT, FILE, TIMEOUT);

    transport.debug = true;
    transport.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");

    try {
        transport.call(NAMESPACE + "#" +  soapAction, envelope);

        Object res = (Object)envelope.getResponse();

        return res;
    } catch (Exception e) {
        Log.e("WebService", e.toString());

        return null;
    }

ソケットのタイムアウトをどこかで変更できますか、または何ができますか?

4

10 に答える 10

4

Web サービスが応答するのに必要な平均時間を提供することで、タイムアウトの例外を制御できます。

HttpTransportSE httpTransport = new HttpTransportSE(URL, timeout_in_millsecond);
于 2016-07-11T09:38:59.647 に答える
3

サービスが応答していないか、ネットワーク接続に問題がある可能性がある場合、ソケットはタイムアウトします。私の場合、サービスが応答し始めたとき、ソケットタイムアウト例外が発生しなかったため、問題は解決しました。これが私のコードです:

public SoapObject soap(String METHOD_NAME, String SOAP_ACTION, String NAMESPACE, String URL) throws IOException, XmlPullParserException 
{
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); //set up request
    // adding a property to SoapObject
    PropertyInfo pi = new PropertyInfo();
    FileDetailList C = new FileDetailList();
    pi.setName("C");
    pi.setValue(C);
    pi.setType(C.getClass());
    request.addProperty(pi);
    //  request.addProperty("iTopN", "5"); //variable name, value. I got the variable name, from the wsdl file!
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); //put all required data into a soap envelope
    envelope.setOutputSoapObject(request);  //prepare request
    HttpTransportSE httpTransport = new HttpTransportSE(URL);
    //  AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL);  
    httpTransport.debug = true;  //this is optional, use it if you don't want to use a packet sniffer to check what the sent message was (httpTransport.requestDump)
    httpTransport.call(SOAP_ACTION, envelope); //send request
    //  SoapObject result=(SoapObject)envelope.getResponse();
    SoapObject result=(SoapObject)envelope.bodyIn; //get response
    return result;          
}
于 2012-06-19T11:57:13.433 に答える
2

これが私が抱えていた問題と同じかどうかはわかりません。複数の呼び出しがあり、実際のデバイスでは最初の呼び出しのみが機能し、残りはタイムアウトで失敗しました。

各通話の後に切断すると、問題が解決しました。

transport.call(NAMESPACE + "#" +  soapAction, envelope);
transport.getServiceConnection().disconnect();
于 2012-12-14T13:52:55.560 に答える
0

誰かがまだこれに遭遇した場合、私のケースは ksoap2-android-2.5.2.jar から ksoap2-android-assembly-2.5.8-jar-with-dependencies.jar に変更され、SocketTimeoutException のスローが停止します

于 2017-11-02T10:32:52.590 に答える
0

2019年アップデート!

これに関する問題を解決するために長い時間を費やした後、調査結果を投稿したいと思います。

  • エミュレーターでは 100% 正常に動作しましたが、私の電話ではまったく動作しませんでした。(エミュレーターはネットワーク上のサービスに IP アドレスを必要としましたが、マシン名を解決できませんでした)

  • 電話で実行している場合SocketTimeoutException、回線が実行された直後に呼び出しが常に発生しましたandroidHttpTransport.call(soap_action,envelope)。次のようにタイムアウトを設定しても、「待機」はありませんでした。

    HttpTransportSE androidHttpTransport = new HttpTransportSE(wsdl_url,40000000)

  • 私は kSOAP の v2.5.2 を使用していましたが、以前の応答で mya に変更したことに感謝しksoap2-android-assembly-2.5.8-jar-with-dependencies.jarます。これで問題は解決しませんでしたが、表示されるエラー メッセージが変更されました。Cleartext HTTP traffic not permitted

  • この問題は、AndoidManifest.xml の Application セクションに次の行を追加することで簡単に修正できます。

    android:usesCleartextTraffic="true"

また、APK からのインストールを許可するには、Google Play プロテクトを無効にする必要がありました

見たい場合は、私のプロジェクトのZIPを参照してください。誰でも使える公共のインターネット Web サービス ( http://www.dneonline.com/calculator.asmx ) が含まれています。もう 1 つのボタンはローカル サービスを呼び出すため、失敗します。この時点に到達するために必要なコメント アウトされた行がたくさんありますが、無視してください。

于 2019-04-06T14:04:44.663 に答える