私はAndroid用のWebサーバーで作業していますが、これを修正しようと数日間を費やしたにもかかわらず、バグ。私はブラウザからリクエストを読み込もうとしていますが、ほとんどの場合、コードはうまく動作しますが、要求の5%が失敗し、Socketの1文字も読み込まなくてもランダムなSocketTimeoutExceptionsがスローされます。.read()はデータが存在するにもかかわらず断続的なSocketTimeoutExceptionをスローする
私はこれをさまざまなブラウザでテストしましたが、すべてのブラウザでこれがテストされています。問題は私の目的です。
public class ServerThread extends Thread {
private ServerSocket ss = null;
private boolean isRunning;
private ExecutorService threadPool = new ThreadPoolExecutor(2, 12,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
public ServerThread() {
}
public synchronized void run() {
ss = new ServerSocket(8080, 1);
isRunning = true;
while (isRunning) {
Socket clientSocket = null;
try {
if (ss != null) {
clientSocket = ss.accept();
if (isRunning) {
this.threadPool.execute(new HTTPSession(clientSocket));
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
そして:
public class HTTPSession implements Runnable {
private Socket mSocket = null;
public HTTPSession (Socket s) {
mSocket = s;
}
public void run() {
InputStream ips = null;
try {
mSocket.setSoTimeout(15000);
ips = mSocket.getInputStream();
ips.read();
}
catch (Exception e) {
e.printStackTrace();
Log.v("HTTPSession", "Socket connected: " + mSocket.isConnected() + ", Socket closed: " + mSocket.isClosed() + ", InputShutdown: " + mSocket.isInputShutdown());
}
finally {
try { ips.close(); } catch (IOException ioe) { }
try { mSocket.close(); } catch (IOException ioe) { }
}
}
}
のでServerThreadが接続を受け付け、たHTTPSessionがソケットから読み取ろうとすると、時にはそれは15の後にしてSocketTimeoutExceptionをスローここで、可能な限りストリップダウン関連するコードは、です秒が上がっています。
この場合、キャッチログインステートメントの出力は次のようになります。 ソケット接続:trueの場合、ソケットが閉じ:偽、InputShutDownを:偽
を与えますか?確かに15秒で十分ですが、主流のウェブブラウザがデータを送信していない可能性は低いですが、なぜ私はそれを読むことができませんか?
私はこの問題の入力を感謝します。
ありがとうございました!おそらく、完全なコードが実際にソケットをWiFi IPにバインドしていると言わざるを得ないので、比較的高帯域幅/低遅延の環境です。私は長いタイムアウトで遊んでみましたが、同じ数の例外が発生しています。短いタイムアウトのもう1つの理由は、15秒後にリクエストが成功する可能性が非常に低い場合、ユーザーが2分間空白の画面を見ていないようにすることです。 –