Android - Socket time-out
Habe ich einige seltsame sockel Verhalten geht. Ich habe ein timeout von 5 Sekunden mit setSoTimeout. Dies sollte genügend Zeit sein in meiner situation. Nach ein online java Dokumentation einer SocketTimeoutException
geworfen werden sollte, wenn es mal aus. Es sagt auch, dass der sockel ist immer noch gültig. Also ich will, es zu fangen und dann weiter. Aber statt der innere Haken, der äußere catch - IOException
Fang der expception und wenn ich die Ausgabe in die log-details Sie sagt, es war ein SocketTimeoutException
. Eine andere verblüffende Sache ist, ändere ich den timeout von 5 Sekunden, um zu sagen, 15 Sekunden und melden Sie sich die Zeit nehmen, für jeden zu Lesen, die immer mal wieder in den milli-Sekunden-Bereich, nie auch nur annähernd eine Sekunde. Alle Ideen werden SEHR geschätzt.
ReadThread
code-snippet
@Override
public void run()
{
try
{
while (true)
{
byte[] sizeBuffer = new byte[BYTES_FOR_MESSAGE_SIZE];
int bytesRead = this.inputStream.read(sizeBuffer);
int length = 0;
for (int i = 0; i < BYTES_FOR_MESSAGE_SIZE; i++)
{
int bitsToShift = 8 * i;
int current = ((sizeBuffer[i] & 0xff) << bitsToShift);
length = length | current;
}
byte[] messageBuffer = new byte[length];
this.socket.setSoTimeout(5000); //5 second timeout
try
{
this.inputStream.read(messageBuffer);
}
catch(java.net.SocketTimeoutException ste)
{
Log.e(this.toString(), "---- SocketTimeoutException caught ----");
Log.e(this.toString(), ste.toString());
}
}
}
catch (IOException ioe)
{
Log.e(this.toString(), "IOException caught in ReadThread");
Log.e(this.toString(), ioe.toString());
ioe.printStackTrace();
}
catch (Exception e)
{
Log.e(this.toString(), "Exception caught in ReadThread");
Log.e(this.toString(), e.toString());
e.printStackTrace();
}
this.interfaceSocket.socketClosed();
}//end run
InformationsquelleAutor bursk | 2010-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Stimme mit Brian. Sie werden wahrscheinlich bekommen die timeout-auf den ersten Lesen, nicht die zweite. Die timeout-einmal eingestellt bleibt wirksam, bis Sie Sie wieder ändern.
Ihre zweite call Lesen, wo Sie Lesen die "Botschaft" anzunehmen scheint (a) Lesen Sie die gesamte Nachricht und (b) dass es abgewiesen wird, wenn Sie die gesamte Nachricht nicht ankommen innerhalb von 5s. Es funktioniert so nicht. Es wird timeout, wenn nichts kommt innerhalb von 5s, oder sonst es wird Lesen, was angekommen ist, bis zu Meldung.Länge. Aber es konnte nur ein byte.
Sollten Sie verwenden
DataInputStream.readFully()
zum Lesen der gesamten Nachricht, und Sie brauchen, um vollständig zu überdenken, Ihre timeout-Strategie.InformationsquelleAutor user207421
Ausnahme ist wohl gefangen in den ersten versuchen zu fangen, da der frühere Aufruf dieser.inputStream.read(). Sie haben zwei dieser Gespräche: eines in der äußeren versuchen, eine in der inneren versuchen.
Haben Sie validiert, wenn Daten gelesen werden? Wenn Daten gelesen werden, dann sollten Sie erwarten, dass die read-operation zurück nach ein paar Millisekunden. Wenn die Daten nicht gelesen werden, dann die read-operation blockieren sollte es für die Zeit, die Sie angeben. Vielleicht hat das zu tun mit der Reihenfolge, die Sie setSoTimeout (vielleicht tun es früher helfen).
Glück,
B-Rad
InformationsquelleAutor Brian