私のアプリは、http://127.0.0.1/...
(localhost URL)を介して、動作している同じデバイスにアクセスする必要があります。
何らかの理由で、JSONコンテンツを使用してWebサイトにアクセスしたときに、約50%(おそらく正確に50%)の場合、例外が発生します。
Java.net.SocketException:recvfrom failed:ECONNRESET(ピアによる接続のリセット)
他の50%については、完全に良い結果が得られます。ポーリング(およびポーリング間の大きな遅延さえ)を試みましたが、同じ奇妙な結果を得続けています。
私はインターネットとここも検索しましたが、なぜそれが起こるのかわかりません。ピアは、クライアントがそれを引き起こしたことを意味しますか?なぜそれが起こりますか、それをどのように処理する必要がありますか?
よくあることだと言うウェブサイトもありますが、そのような場合に何をするのがベストかはわかりませんでした。
OK、答えはサーバーの障害だということでした-各リクエストの後に接続を閉じなければなりませんでした。
Androidは接続のプールを保持し、古い接続などを使用します。
とにかく、今では動作します。
編集:HttpURLConnection
のAPIによれば、これはクライアント側でも解決できます:
このクラスによって返される入力および出力ストリームはバッファリングされません。ほとんどの呼び出し元は、返されたストリームをBufferedInputStreamまたはBufferedOutputStreamでラップする必要があります。バルク読み取りまたはバルク書き込みのみを行う呼び出し元は、バッファリングを省略できます。サーバーとの間で大量のデータを転送する場合は、ストリームを使用して、一度にメモリに保存するデータの量を制限します。ボディ全体を一度にメモリに入れる必要がない限り、ボディ全体をストリームとして処理します(ボディ全体を1バイトの配列または文字列として保存するのではなく)。
待機時間を短縮するために、このクラスは複数のリクエスト/レスポンスのペアに対して同じ基盤のソケットを再利用できます。その結果、HTTP接続が必要以上に長く開いたままになる場合があります。 disconnect()を呼び出すと、接続されたソケットのプールにソケットが返される場合があります。 HTTPリクエストを発行する前にhttp.keepAliveシステムプロパティをfalseに設定すると、この動作を無効にできます。 http.maxConnectionsプロパティを使用して、各サーバーへのアイドル接続の数を制御できます。
から取得: developer.Android.com/reference/Java/net/HttpURLConnection.html
接続する前にHttpURLConnectionにこのプロパティを設定してみてください:
conn.setRequestProperty("connection", "close");
これにより、デフォルトでオンになっている「keep-alive」プロパティが無効になります。
これは私が知っている古いスレッドです。しかし、これは誰かを助けるかもしれません。
私の場合、このエラーは.NET WCF(soap)サービスが原因でした。返される結果のオブジェクトの1つに、get {}プロパティが設定されたDataMemberがあり、set {}プロパティがありませんでした。
シリアル化を行うには、すべてのDataMemberでget {}とset {}の両方が使用可能になっている必要があります。空のセット{}(ビジネスルールにより空)を実装し、問題は解決しました。
私のscenerioは特定の悪いサーバー実装ですが、トラブルシューティングの際に誰かが時間を節約するのに役立つかもしれません。
私はこれらをたくさん持っていたConnection reset by peer
特定のWebページにアクセスしているとき、またはファイルをダウンロードしているとき(アプリまたはAndroidブラウザ)から)。
接続をブロックしたのは私の3Gキャリアでした(たとえば、.exe
ファイルは禁止されていました)。
Wifiでも同じ問題がありますか?
私の状況では、オペレーターが作成したAPNからプロキシアドレスとポートを削除することで問題が解決しました。私がテストしたように、ドメイン名の代わりにリモートサーバーのIPアドレスを使用しても問題を解決できます。