Ich bin neu in Android, etwas neues Socket-Programmierung. Ich habe zwei Geräte, läuft Android 5.1
, mit WiFi direkt verbunden (nicht sicher, ob das relevant ist). Ich habe einen Dienst, bei dem der Server auf eine Anfrage auf einem Socket wartet und dann eine Antwort zurück an den Client sendet.Android WiFi Direct Client-Socket-Timeout
Ebenso sendet der Client-Code eine Anfrage und wartet auf die Antwort vom Server. Der Server sendet die Antwort, aber der Client erhält die Nachricht nie und der Socket-Timeout.
Server-Testcode:
while (true) {
try {
Log.i(TAG, "test waiting for a request");
mServer = new ServerSocket(PORT);
Socket socket = mServer.accept(); //Block to receive message //
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Log.i(TAG, "Message received! " + in.readLine());
String msg = "This is my reply.";
OutputStream outputStream = socket.getOutputStream();
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
out.println(msg);
out.flush();
out.close();
} catch (SocketException e) {
Log.e(TAG, "Socket Accept Interrupted", e);
} catch (IOException e) {
Log.e(TAG, "Socket Failure", e);
} finally {
if (mServer != null && mServer.isBound()) {
try {
mServer.close();
} catch (IOException ioException) {
Log.e(TAG, "Failed to close socket trying to recover from SocketException", ioException);
}
}
}
}
Client-Testcode:
Socket socket = null;
SocketAddress addr = new InetSocketAddress(host, PORT);
int socketTOms = 5000;
try {
socket = new Socket(host, PORT);
socket.setKeepAlive(false);
String syncReq = "Request to server.";
//Send Request//
OutputStream outputStream = socket.getOutputStream();
outputStream.write(syncReq.getBytes());
socket.setSoTimeout(socketTOms);
//Rcv reply//
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Log.i(TAG, "Message received! " + in.readLine());
} catch (SocketTimeoutException e) {
Log.e(TAG, "Timeout while reading from socket: timeout=" + socketTOms);
} catch (Exception e) {
Log.e(TAG, "Exception", e);
} finally {
if (socket != null && socket.isConnected()) {
try {
socket.close();
} catch (IOException e) {
Log.e(TAG, "Exception while closing socket", e);
}
}
}
ich den Server und Client auf zwei verschiedenen Geräten über Android Studio ausgeführt und kann in den Protokollen, dass der Server sehen empfängt die Anfrage und sendet die Antwort, aber der Client immer throws
SocketTimeoutException
. Ich sah sonst, wo das socket.setKeepAlive(false)
das Problem beheben würde, aber es scheint keine Wirkung zu haben.
Scheint einfach genug, aber ich kann nicht sehen, was ich hier vermisse.
Danke Sháilèndra Wregmi –