我正在爲Android安裝一個Web服務器,儘管我花了好幾天的時間試圖解決它,但我在這個特定的環境下錯誤。我試圖讀取來自瀏覽器的請求,並且大部分時間代碼都能正常工作,但是有5%的請求失敗,並且拋出隨機SocketTimeoutExceptions,甚至沒有從Socket讀取單個字符。.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試圖從Socket讀取,有時在15後拋出SocketTimeoutException秒數到了。
從日誌語句的輸出在catch在這種情況下是: 插座連接:真實,插座關閉:假的,InputShutDown:假
是怎麼回事?當然,15秒就足以等待了,主流網頁瀏覽器似乎不可能發送任何數據,爲什麼我不能讀取它?
我將不勝感激這個問題的任何輸入。
謝謝!也許我應該提到完整的代碼實際上將套接字綁定到wifi IP,因此它是一個相對較高的帶寬/低延遲環境。我試着玩更長的超時,但發現我得到的例外數量相同。短暫超時的另一個原因是,我不希望用戶在15秒後發送成功的請求的可能性很小時,不會讓用戶在空白屏幕上盯着兩分鐘。 –