Socket Java Server mit Android App, Antwort vom Server an App

Fabse

Aktives Mitglied
Hi,

folgende Ausgangssituation (siehe auch hier http://www.java-forum.org/java-basi...riable-thread-main-methode.html#post1041385):
Auf einem Rechner läuft ein Java Programm als Server. Eine Android App dient als Client. Stand der Dinge ist: Ich kann über die App eine Zahl an den Server schicken, dieser verarbeitet die Zahl und kann sie speichern.
Jetzt bin ich noch mit meiner Umsetzung etwas unzufrieden... mein Server läuft so:
Java:
		while (laeuft) {

			try {

				clientSocket = serverSocket.accept(); // accept the client
														// connection
				
				inputStreamReader = new InputStreamReader(
						clientSocket.getInputStream());
				bufferedReader = new BufferedReader(inputStreamReader); // get
																		// the
																		// client
																		// message
				message = bufferedReader.readLine();
				zahlVomSmartphone = Integer.parseInt(message);

				if (zahlVomSmartphone != 0) {

					setNeueZahl(zahlVomSmartphone);

				}

				System.out.println(message);
				inputStreamReader.close();
				clientSocket.close();

			} catch (IOException ex) {
				System.out.println("Problem in message reading");
			}

		}

und zwar läuft dieser als Thread, damit die normalen Berechnungen parallel laufen können.
Jetzt ist es aber so, dass bei dem o.g. Code der Server die ganze Zeit auf
Java:
clientSocket = serverSocket.accept();
wartet, bis meine App eine Zahl "rüberschickt". Das ist im Prinzip auch völlig ok so, aber ich möchte z.B. um 19 Uhr mein Programm automatisch beenden lassen. (Dazu gleich die nächste Frage wie stelle ich das am geschicktesten an? Ich kann ja schlecht eine Schleife schreiben, die die ganze Zeit die aktuelle Uhrzeit vergleicht, ob schon 19 Uhr ist!? Performance-technisch ja murks).
Also um 19 Uhr soll das Programm sich automatisch beenden, jetzt hängt der Thread aber noch bei
Java:
clientSocket = serverSocket.accept();
, das heißt erst wenn ich nach 19 Uhr noch einmal eine Zahl rüberschicke, wird der Thread auch erst beendet. (ich kann ja einfach wenn 19 Uhr laeuft = false setzen).
Aber das will ich so natürlich nicht. Wenn es 19 Uhr ist, soll der Server auch direkt herunter gefahren werden. Ich hoffe man versteht was ich meine?

Wenn meine App dann eine Zahl übermittelt hat, soll der Server doch bitte eine Bestätigung schicken, dass die Zahl angekommen ist. Darüberhinaus, soll der Server auch der App eine Benachrichtung schicken, wenn durch die Zahl ein Ereignis ausgelöst wurde (das kann erst Stunden nach dem die Zahl eingegegeben wurde, passieren). Android Benachrichtigung soll hier nicht das Thema sein, vereinfacht erst mal ein System.out.println.
Aber da weiß ich jetzt nicht, wie das gehen soll, das Smartphone ändert ja auch die ip? Brauche ich da auch ein dns server? Oder wie funktioniert das? Zuerst mal läuft die App auch nur auf einem Smartphone, sodass nicht an mehrere geschickt werden muss.

Kann mir da wer auf die Sprünge helfen? Danke.
 
Du könntest einen zweiten Thread starten, dieser berechnet, wie lange es noch dauert, bis es 19 Uhr ist und dann legst du ihn schlafen. Wenn es 19 Uhr ist, beendet dieser Thread den Serverthread und beendet danach das Programm.
 
Ok das mit der Uhrzeit habe ich dann.
Aber ich weiß leider noch nicht wie ich den Server dann stoppen kann...da der Server ja immer beim accept "hängt".
 
Im Server gibt es eine Methode schließeAb(), die die Verbindungen trennt und alles macht, was du für richtig hältst und am Schluss wird System.exit(0) aufgerufen.
 
Ok habe jetzt soweit fast alles... aber eins blicke ich noch nicht:
App ist mein Client. Java Programm Server. Wenn ich jetzt Montag um 10 eine Zahl speicher (also sie wird über die App an den Server übermittelt er speichert sie) und am Mittwoch um 15 Uhr passiert was mit der Zahl, sodass der Client benachrichtigt werden soll, wie geht das? Also der Client sendet am Mittwoch keine zahl an den Server es kommt keine Verbindung zu stande. Aber dann soll der Server dem Client eine Nachricht schicken.
Kann ich dann einfach, wenn ich meine App starte eine Verbindung aufbauen und die bleibt dann so lange bestehen?
Bzw. muss sie ja nicht bestehen bleiben, aber der Server muss ja wissen an wen die Nachricht gehen soll...

Versteht man was ich meine? Vorschläge?
 
Du implementierst eine Warteschlange, in der alles gespeichert wird, was der Server den Klienten gerne mitteilen würde. Diese Schlange gibt es für jeden Klienten.
Verbindet sich ein Klient, so wird nachgesehen, ob Mitteilungen vorhanden sind. Wenn ja, dann werden diese Mitteilungen verschickt, wenn nein, dann eben nicht.

Zu der permanenten Verbindung: du müsstest gucken, wie praktikabel das ist. Wenn die Synchronisation nicht so wichtig ist, kannst du dich auch pro Minute ein mal verbinden, nachgucken, ob Nachrichten vorhanden sind und dann wieder trennen.
 

Zurück
Oben