나는 안드로이드 용 웹 서버에서 일하고 있습니다. 고칠 시간을 보냈지 만,이 특별한 곤충. 브라우저에서 요청을 읽으려고하는데 대부분의 경우 코드가 제대로 작동하지만 요청의 5 %가 실패하고 Socket의 단일 문자를 읽지 않아도 임의의 SocketTimeoutExceptions가 throw됩니다..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를 던졌습니다 초 있습니다.
이 경우 캐치에 로그인 문의 출력은 다음과 같습니다 소켓 연결 : 사실, 소켓 폐쇄 : 거짓, InputShutDown :
무엇 제공거짓을? 물론 15 초만으로도 충분하며 주류 웹 브라우저가 데이터를 전송하지 않을 것 같아서 왜 읽을 수 없습니까?
이 문제에 대한 의견을 보내 주시면 감사하겠습니다.
감사! 아마도 전체 코드가 실제로 소켓을 Wi-Fi IP에 바인딩한다고 언급 했어야했기 때문에 비교적 높은 대역폭/낮은 대기 시간 환경이었습니다. 더 긴 타임 아웃으로 놀아 보려고했지만 같은 수의 예외가 있다는 것을 알았습니다. 짧은 시간 제한의 또 다른 이유는 사용자가 빈 화면을 2 분 동안 쳐다 보지 않고 15 초 후에 성공적인 요청이 전송되는 것을 원하지 않는다는 것입니다. –