RMI Callback (mit Threads?)

pyramid

Neues Mitglied
Hallo zusammen

Ich habe ein vermutlich einfaches Problem, das ich nicht zu lösen weiss :oops:. Bin totaler Java-Anfänger, deshalb: habt bitte erbarmen ;).

Folgende Klassenstruktur habe ich:

- Server (startet RMI-Registry)
- Hello (Interface)
- HelloImpl (ArrayList von Clients, Methoden: addClient, removeClient, sendHello)
- Client (Interface)
- ClientImpl(Methoden: getName (über Kommandozeile wird Name übergeben), printHello)
- Main-Klasse mit main-Methode macht folgendes:
-> Referenz auf Hello-Objekt mit Naming.Lookup
-> neuer Client erstellen
-> Client hinzufügen (addClient)
-> warten auf User-input 'end' mit Scanner
-> wenn 'end' dann, Client aus Array-List in Hello entfernen

Der Server soll nun an alle angemeldeten Clients alle zwei Sekunden ein 'Hello World' senden. Die Clients sollen warten, bis der User mit "end" das Programm abbricht und sich dann vom Server wieder abmelden.

Das sendHello in HelloImpl wird in einer Endlos-Schleife an alle im Array-List gespeicherten Clients geschickt (printHello), danach wird zwei Sekunden geschlafen (sleep(2000).

Nun wird im Client auf den User-Input gewartet. Sobald ich 'end' eingebe, kommt er zwar zur Stelle, wo der Client wieder aus der Array-List entfernt wird, aber der Server schickt trotzdem das Hello World weiter an die Clients.

Wie unterbreche ich nun meine Endlosschleife in HelloImpl.sendHello? Muss das sendHello mit einem Thread mit Hilfe von wait und notify realisiert werden? Oder wie kann ich sonst auf den Client umschalten, so dass dort das removeClient ausgeführt werden kann und danach im sendHello der abgemeldete Client keine Hello Worlds mehr erhält?

Ich bin wirklich dankbar für einen Hinweis. Das mit dem RMI-Callback glaube ich verstanden zu haben, aber ob und wie RMI mit allfälligen Threads arbeitet kapier ich nicht.

Vielen Dank für alle Tips im Voraus.

pyramid
 
T

tuxedo

Gast
Wie unterbreche ich nun meine Endlosschleife in HelloImpl.sendHello?

Mit einer passenden Abbruch-Bedingung :)
Java:
....

while(!stopped) {

...

}

....

public void stopIt() {
    stopped=true;
}

Alles in allem: Der Konstrukt ist etwas "wirr" um es ohne Sourcecode zu erklären. Wie wär's wenn du hier und da dein Vorgehen mit einem Code-Ausschnitt erklärst?

Alex
 

pyramid

Neues Mitglied
Hallo Alex

Vielen Dank für deine Antwort. Das hatte ich auch schon versucht (stopIt hab ich dann im try-Block vor dem Remove aufgerufen in der Main-Klasse und stopped auf true gesetzt), aber hab dann dasselbe Problem, wie ohne: Er ignoriert das dann im HelloImpl in der Endlosschleife komplett, da er irgendwie nicht mehr auf den Main-Thread umschaltet.

Aber du hast recht, ich muss Code posten:

Java:
public class HelloImpl extends UnicastRemoteObject implements Hello
{
    private ArrayList<Client> Clients;
     public HelloImpl () throws RemoteException
	{
		Clients = new ArrayList<Client>();
	}

       ...
       public synchronized boolean addClient(Client c) throws RemoteException
       {
              ....
              Clients.add(c);
               sendHello();
              ...
        } 
        public synchronized void sendHello() throws RemoteException
	{
		
			while(true)
			{
				for(Iterator<Client> iter = Clients.iterator();iter.hasNext();)
				{
					sleep(2000);
					Client c = iter.next();					
					try
					{
						c.print("Hello World");
					}
					catch(RemoteException e)
					{
						iter.remove();
					}
				}
			}
		}	
                public synchronized void removeClient.....{}
                ....
}

public class Main
{
        public static void main (String[] args)
        {  
             ...
            Hello hello = (Hello)Naming.lookup(path);
            ClientImpl client = new ClientImpl("Name");
            try
            {
                if(hello.addClient(client)
                {
                    Scanner scan = new Scanner(System.in);
                    if(scan.nextLine().equals(""))
                    {
                         hello.removeClient(client);
                    }
                   }
            }
            ....
            }
}

So und wenn ich nun den Server gestartet habe, und danach das Main starte, dann kommt er bis zum if(scan.nextLine().equals("")) und danach kann ich solange enter drücken, er kommt dann nicht zum removeClient sondern schickt mir weiterhin hello worlds aus dem HelloImpl auf die Console.

Falls ihr noch mehr Code braucht, gebt einfach Bescheid.

vg
pyramid
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B callback thread udp Netzwerkprogrammierung 2
C RMI Callback Netzwerkprogrammierung 8
B RMI RMI, Callback und Netzwerk Netzwerkprogrammierung 6
I Rmi Callback Netzwerkprogrammierung 5
T TCP mit und ohne Threads Netzwerkprogrammierung 1
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
D Exception Handling bei In/Outputsockets in eigenen Threads Netzwerkprogrammierung 1
C Frage zu Threads & Server Netzwerkprogrammierung 4
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
J Threads & Streams Netzwerkprogrammierung 9
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S HTTP ServerSockets und Threads Netzwerkprogrammierung 5
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
R Threads mit einem WebService Netzwerkprogrammierung 4
M Verständnisfrage zu RMI und Threads Netzwerkprogrammierung 2
L einfacher server ohne threads Netzwerkprogrammierung 4
A Threads auflisten und nacheinander ansprechen Netzwerkprogrammierung 6
C I/O - Synchronisation durch Threads in einem ChatClient Netzwerkprogrammierung 4
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
P Threads einbinden Netzwerkprogrammierung 11
T RMI Threads und Synchronized Netzwerkprogrammierung 13
A Datenverteilung: Mehrere Threads verwenden? Netzwerkprogrammierung 4
S Threads beim Server koordinieren Netzwerkprogrammierung 5
L ClientServer mit 2 Threads Netzwerkprogrammierung 5
N Threads und Socketprogrammierung Netzwerkprogrammierung 4
G 1 Socket 2 Threads problem Netzwerkprogrammierung 13
K Problem mit Threads Netzwerkprogrammierung 3
S Threads bei Web Service sinnvoll oder Alternative? Netzwerkprogrammierung 2
K Hintergrund - Threads Netzwerkprogrammierung 3
G Socket Programmierung - Max. Threads Netzwerkprogrammierung 5
C NetScanner arbeitet trotz Threads langsam Netzwerkprogrammierung 6
L UDP-Server mit Threads Netzwerkprogrammierung 8
K Windows 10 Threads gleichzeitig Netzwerkprogrammierung 18
C Join von Threads bei I/O-Operation Netzwerkprogrammierung 6
F Threads synchronisieren mit Pipes Netzwerkprogrammierung 3
G benötige Beispiel für parallel ablaufende Threads Netzwerkprogrammierung 3
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
TRunKX Threads beenden sich selber? Netzwerkprogrammierung 6
T Kleiner Chatserver: Threads oder Multiplex? Netzwerkprogrammierung 18

Ähnliche Java Themen

Neue Themen


Oben