Android TCP Sockets timeout
Mache ich eine app benötigt für die Kommunikation mit TCP-sockets. Ich habe ein Service, der meine TCP-Server und eine Tätigkeit, die ist mein TCP-Client.
Habe ich eine große Verzögerung zwischen senden einer Nachricht und dem Empfang einer Antwort vom server, wie 10 oder mehr Sekunden. Nach einigen Tagen der Forschung, fand ich, wie set timeout auf der client-Anfrage und alle beginnen zu funktionieren.
Also meine Frage ist, ist es zwingend erforderlich, um set-up-timeout für eine TCP-Verbindung, sonst funktioniert es nicht oder es ist etwas anderes falsch mit meiner Umsetzung?
Hier ist mein Client-code:
public static void sendTCP(final InetAddress senderAddr, final String Msg, final int serverPort) {
Thread tclient = new Thread(){
public void run() {
boolean connected;
Socket socket = new Socket();
try {
Log.d("TCP", "Client: Connecting...");
socket.bind(null);
socket.connect((new InetSocketAddress(senderAddr, serverPort)), 1000);
connected = true;
try {
Log.d("TCP", "Client: Sending command.");
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
out.println(Msg);
out.close();
}
catch (Exception e) {
Log.e("TCP", "Client: Error sending.", e);
}
} catch (Exception e) {
Log.e("TCP", "Client: Error connecting.", e);
connected = false;
}
finally {
if (socket != null) {
if (socket.isConnected()) {
try {
socket.close();
Log.d("TCP", "Client: Connection Closed.");
} catch (IOException e) {
Log.e("TCP", "Client: Error closing connection.", e);
}
}
}
}
}
};
tclient.start();
}
Und Server:
public void onStart(Intent intent, int startid) {
t = new Thread(){
public void run() {
try {
Boolean end = false;
Log.d("TCP", "Server: Creating server.");
ServerSocket ss = new ServerSocket(TCPPORT);
while(!end) {
//Server is waiting for client here, if needed
Log.d("TCP", "Server: Waiting on packet!");
Socket s = ss.accept();
BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
String st = input.readLine();
Log.d("TCP", "Server: Message received from client: "+st);
InetAddress senderAddr = s.getInetAddress();
senderAddrString= senderAddr.getHostAddress();
myAddrString = GetLocalIpAddress();
myAddr = InetAddress.getByName(myAddrString);
if (senderAddr.equals(myAddr)) {
}
else {
//Estraggo dal pacchetto ricevuto
try {
StringTokenizer tokens = new StringTokenizer(st, "|");
flag = tokens.nextToken();
userid = tokens.nextToken();
payload = tokens.nextToken();
}
catch (Exception e) {
Log.e("TCP", "Server: Errore estrazione dati.");
}
if (flag.equals(Constants.flag_scan_answer)) {
Log.d("TCP", "Server: Flag answer");
//devo passare i dati ad un database ScanActivity
//database(senderAddrString,userid);
System.out.println("RISPOSTA RICEVUTA DAL SERVICE TCP");
System.out.println("FLAG " + flag);
System.out.println("USERID " + userid);
System.out.println("PAYLOAD " + payload);
announceReceivingPacket();
}
else {
Log.d("TCP", "Server: CASO NON PREVISTO");
}
}
s.close();
}
}
catch (UnknownHostException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
};
t.start();
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht vorgeschrieben, aber es ist eine sehr gute Idee. Beginnen Sie mit der Einstellung es das doppelte oder dreifache der erwarteten service-Zeit und so einstellen, dass Sie nicht bekommen, false-positives. Die Standard-Zeitüberschreitung beim Lesen ist unendlich, und ich habe gesehen, ganze Plattformen nicht in einer Weise, die nicht nachweisbar durch den Leser in irgendeiner anderen Weise als ein read-timeout.
Sehen hier für relevante Zitate.