Event ähnliches System

Status
Nicht offen für weitere Antworten.

H3llGhost

Bekanntes Mitglied
Hallo Leute,

ich habe mal eine Frage:
Ich schreibe eine Applikation die auf übertragene "Eventcodes" reagieren soll.
Eventcodes wie zum Beispiel Login, Logout, etc.
Dafür habe ich mir eine Klasse ServerEvent angelegt mit einer Funktion doEvent():

Java:
import java.net.Socket;

public class ServerEvent {
	private Server s;
	public ServerEvent(Server s) {
		this.s = s;
	}
	
	void doEvent(String event, String msg, Socket s) {
		
	}
}

Also ich habe mir gedacht, ich lege eine ArrayList an mit allen möglichen EventCodes um ein möglichen ServerHack oder ähnliches zu umgehen.
Und dann soll der String zu einem Funktionsnamen werden und ausgeführt werden.
Mein Problem ich weiß nicht wie ich das umsetzen kann.

Alternativ habe ich mir schon EventListener angeschaut und ähnliches, aber ich weiß nicht, ob ich sowas für meine Idee nutzen kann.

Vielen Dank im Vorraus. :)
 
S

SlaterB

Gast
die Liste wird wohl kaum verhindern, dass jemand anders auch "Login" senden kann,

allgemein ist wenig von einer Frage erkennbar,
wie Protokolle ungefähr funktionieren weißt du anscheinend, jemand sendet ein Kommando,
der andere versteht es und reagiert darauf,

zu deinem Code ist pauschal zu sagen, dass ein Event selber selten eine Methode doEvent hat,
Objekte erstellt man mit Konstruktoren,
das Event kannt vielleicht an einen Handler übergeben werden: handle.doSomethingWithEvent(event);
 

H3llGhost

Bekanntes Mitglied
Na klar verhindern kann ich es nie, aber ich kann einen Absturz der Serverapplikation verhindern. :)

Hmm ...
ich versuche es mal anders zu formulieren.
Ich möchte ungerne mit Hilfe von switch oder if entscheiden welche Funktion ausgeführt werden soll aus diesem Grund die Idee, dass der übertragene Eventcode als Methodenname interpretiert wird und so auch ausgeführt wird.

Deinen Hinweis mit dem Handler verstehe ich nicht so ganz ...
Aber ich hoffe meins hat es etwas verdeutlicht. :)

Als Beispiel mit Variablen:

Java:
String eventcode = "Login";
runEvent("do"+eventcode);

public void doLogin(String[] args) {
  //Methodeninhalt
}
 
S

SlaterB

Gast
per Reflection könnte man Methoden anhand ihres Names aufrufen, falls das die Frage ist,
schön ist das aber nicht und auch nicht sicher, damit hat der Aufrufer quasi den Gesamtzugriff

dann lieber ein switch/ if, so kannst du genau einschränken, welches Kommando erlaubt ist
 

H3llGhost

Bekanntes Mitglied
Ja so könnte das heißen ...
Ich werde mich gleich mal schlau lesen ... ;)

Also ich werde nie die Reflection dann alleine nutzen.
Ich würde vorher überprüfen ob das 1. ein zugelassener eventcode ist und 2. ob die Berechtigungen stimmen.
So dürfte nichts passieren oder?
 

H3llGhost

Bekanntes Mitglied
Hast du eventuell einen guten Link, wo das Thema Reflection erklärt wird?
Ich finde irgendwie nur Sachen, die mich nicht weiterbringen.

Danke im Vorraus für deine Mühe. :)
 
T

tuxedo

Gast
Oder sich den ganzen Kram sparen und gleich ein fertiges RPC System nehmen wie RMI, SIMON, Spring RPC, ... ;-)

Außer man will es "zu Fuß" machen um auch auf low-level Netzwerkkommunikation Erfahrung zu bekommen.

- Alex
 

H3llGhost

Bekanntes Mitglied
@tuxedo:
Es ist meine Aufgabe kein fertiges System zu nehmen. ;)

@SlaterB:
Ich habe mir die Links mal angeschaut und mal ne kleine Testklasse geschrieben.

Java:
package Server;
import java.net.Socket;
import java.util.ArrayList;
import java.lang.reflect.*; 


public class ServerEvent {
	private Server s;
	private Method[] methods;
	
	public ServerEvent(Server s) {
		this.s = s;
		this.methods = this.getClass().getMethods();
		this.doEvent("blabla", new ArrayList<String>(), new Socket());
	}
	
	void doEvent(String event, ArrayList<String> msgs, Socket s) {
		for (int i=0; i < this.methods.length; i++) {
			System.out.println(this.methods[i].toString());
		}
	}
	
	void blabla() {
		
	}
}

Meiner Meinung nach sollte doEvent nur die Methoden doEvent und blabla auflisten.
Aber diese sind garnicht in der Auflistung.
Mir wird folgendes ausgegeben:

public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

Wo ist da mein Denkfehler?
 
S

SlaterB

Gast
API von getMethods() nicht gelesen bzw. nicht alles, was zu Class geschrieben wird, z.B. andere Methoden die ähnliches zurückgeben,
im Lehrbuch stehts recht undeutlich
 
S

SlaterB

Gast
gibt wie gesagt noch eine andere Methode, die das nicht erfordert
 

H3llGhost

Bekanntes Mitglied
So ich bins wieder ... :D
Ich kann das invoke nicht aufrufen und kann es nicht verstehen warum.
Bitte um eine Gedankenhilfe.

Im Konstruktor rufe ich folgendes in der Klasse auf:
Java:
this.methods = this.getClass().getDeclaredMethods();

Und meine Funktion doEvent sieht wie folgt aus:
Java:
	void doEvent(String event, ArrayList<String> msgs, Socket s) {
		this.msgs = msgs;
		this.socket = s;
		int j = 0;
		for (int i = 0; i < this.methods.length; i++) {
			if (this.methods[i].getName().equals("do"+event))
				j = i;
		}
		try {
			this.methods[j].invoke(this);
		} catch (IllegalArgumentException e) {
			System.out.println(e);
		} catch (IllegalAccessException e) {
			System.out.println(e);
		} catch (InvocationTargetException e) {
			System.out.println(e);
		}
		this.msgs.clear();
		this.socket = null;
	}

Er gibt mir jedes Mal eine InvocationTargetException aus und ich verstehe nicht warum.
 
S

SlaterB

Gast
ohne den Inhalt von event und die Methodendeklaration zu verraten, und in der Exception steht auch nix weiteres?

edit:
j sollte am Anfang -1 sein, sonst wird die 0te Methode genommen falls keine gefunden wird..
 
Zuletzt bearbeitet von einem Moderator:

H3llGhost

Bekanntes Mitglied
Ich habe nun den Fehler lokalisieren können.
Er liegt in der Funktion mysql.checkString(2, "blabal").

Die Funktion sieht wie folgt aus:
Java:
	public boolean checkString(int type, String s) {
		String pattern = new String();
		switch (type) {
			case 0: //Nums
				
			break;
			case 1: //Alpha
				
			break;
			case 2: //NumsAlpha
				pattern = "[a-zA-Z0-9]+";
			break;
		}
		return s.matches(pattern);
	}

Zur Info sie befindet sich in einer anderen Klasse und in einer anderen Datei.

Also generell funktioniert die Funktion in einer anderen Klasse aber nicht in der Funktion.
Ich bin am Verzweifeln ... :(
 
Zuletzt bearbeitet:
G

Gastredner

Gast
Wäre es nicht vielleicht einfacher, die Methoden in eigene "ActionObjects" auszulagern statt sie über Reflection aufzurufen? In etwa folgendermaßen:
Java:
public interface ActionObject {

	public void doAction();
}

public class LoginAction implements ActionObject {

	public void doAction() {
		/* 
		 * Hier die Handlung - also den Login - ausführen.
		 * Falls nötig, könnte man auch noch Argumente übergeben, z. B.
		 * in Form einer Map.
		 */
	}
}

public class SomeServer() {

	public SomeServer {
		// Nötige Schritte zur Erzeugung des Servers ausführen und dann irgendwann...
		initializeActions();
		// ...aufrufen, um die vorhandenen Actions zu laden.
	}

	private Map<String, ActionObject> availableActions;
	
	private void initializeActions() {
		availableActions = new HashMap<String, ActionObject>();
		availableActions.put("login", new LoginAction());
		// Und so weiter...alternativ: Vorhandene Actions z. B. aus einer Datei auslesen.
	}

	public void processRequest(String action) {
		ActionObject a = availableActions.get(action);
		if (a != null) {
			// Hier den Fehler - unbekannte Aktion - behandeln.
		} else {
			a.doAction();
			/* 
			 * Alternativ: Map<String, Class> und mit Class.newInstance() eine neue 
			 * Instanz der benötigten Klasse für die Aktion erzeugen.
			 */
		}
	}
}
Oder gäbe es gute Gründe, die dagegen sprächen?
 

H3llGhost

Bekanntes Mitglied
Ich bin wie schon gesagt immer offen für alle neuen Dinge ... :)
Nur ich habe halt ein paar Actions mehr.
Deswegen wüsste ich jetzt nicht wie ich das erweitern könnte.
Kannst du mir eventuell nen Tipp geben?

Danke im Vorraus ... :)
 
S

SlaterB

Gast
ich bin ja eher noch für

if (event.equals("Login") {
doLogin();
} else if
..
} else {
Exception, unknown
}

usw., oder aus dem String eine Enum parsen und dann per switch,
wenn es nur die eine Stelle ist und sonst keine Dynamik, wäre Action vielleicht übertrieben
 

H3llGhost

Bekanntes Mitglied
Danke für eure Hilfe.
Es klappt nun ... :)

Ich hatte die Klasseninitialisierung in der falschen Reihenfolge ... *grml*
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Key-Event-Sender Allgemeine Java-Themen 5
E Datei verschoben Event Allgemeine Java-Themen 3
D Event Sourcing umsetzen Was? Wie? Allgemeine Java-Themen 33
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
FrittenFritze Problem mit einer JComboBox, Event temporär deaktivieren Allgemeine Java-Themen 11
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
M Best Practice Alternativen für Event-Handling Allgemeine Java-Themen 3
C Zugriff auf Event felder Allgemeine Java-Themen 0
Bananabert Interface Custom 'Event' mit Interface Allgemeine Java-Themen 10
das-mo Warten auf Event Allgemeine Java-Themen 7
K Event benutzen Allgemeine Java-Themen 4
F None-GUI-Event Handling Allgemeine Java-Themen 3
D mouseMove in mouseMotionListener-Event Allgemeine Java-Themen 3
R Klasse über Button Event in anderer Klasse informieren Allgemeine Java-Themen 11
K event dispatch thread fehler. Compiler meckert nicht aber der Interpreter? Warum?? Allgemeine Java-Themen 11
A Relative Mausposition ohne Event Allgemeine Java-Themen 2
V Priorität der Event-Handlings setzen Allgemeine Java-Themen 4
algorismi int-variable Value Change event Allgemeine Java-Themen 3
slawaweis Suche Klassen für Event Managment und Time Allgemeine Java-Themen 2
B Window Closing Event Allgemeine Java-Themen 3
A Event Handler Allgemeine Java-Themen 5
G XML Event --> Befüllen einer Node Allgemeine Java-Themen 2
Q Dateizugriff mitbekommen - file change event Allgemeine Java-Themen 13
W eigene event-Klasse, event posten Allgemeine Java-Themen 2
M Speichern von Word als Event abfangen Allgemeine Java-Themen 7
P Event-Handling mit JSP Allgemeine Java-Themen 7
MQue public void serialEvent(SerialPortEvent event) Allgemeine Java-Themen 4
E Wie: Eigener Listener, eigenes Event (möglichst einfach) Allgemeine Java-Themen 29
MQue Button Event beim drücken und beim auslassen Allgemeine Java-Themen 7
T OutputStream - Event bei Byte-Fluss Allgemeine Java-Themen 5
E Button: Event auslösen Allgemeine Java-Themen 7
B event kunstlich auslösen Allgemeine Java-Themen 8
R Dasselbe Event zweimal aufgefangen? Allgemeine Java-Themen 10
D Thread durch Mouse-Event beenden Allgemeine Java-Themen 5
I Listener/Event selber machen. Allgemeine Java-Themen 4
S methode stoppen / auf ein event warten Allgemeine Java-Themen 5
G Key Event Allgemeine Java-Themen 2
B Thread soll auf Event warten, dann Daten an Klasse senden Allgemeine Java-Themen 2
G konsolenanwendung durch key event beenden Allgemeine Java-Themen 4
M Event Queues in Java? Allgemeine Java-Themen 10
G Problem Canvas Mouse Event Allgemeine Java-Themen 7
J ToolTipText Event abfangen Allgemeine Java-Themen 5
A Endlosschleife + Event Allgemeine Java-Themen 7
G EHM EVENT handling ? Allgemeine Java-Themen 5
C Menü & event Allgemeine Java-Themen 4
C event weiterreichen Allgemeine Java-Themen 3
B TypeOf oder ähnliches gesucht Allgemeine Java-Themen 3
G Gibt es etwas ähnliches wie den ReadKey bei Pascal? Allgemeine Java-Themen 3
T Timer oder ähnliches? Allgemeine Java-Themen 3
C dll? oder ähnliches? Allgemeine Java-Themen 5
X Input/Output InputStream/Scanner(System.in) read()/hasNextLine() block unterbrechen Allgemeine Java-Themen 7
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
B Lottospielen mit System, Versuch 2, noch umständlicher als vorher Allgemeine Java-Themen 1
J Frage zu System.getproperties. Allgemeine Java-Themen 60
sascha-sphw Erste Schritte Unit und Integration-Tests im Java Modul System Allgemeine Java-Themen 10
F Frage zu System.in Allgemeine Java-Themen 3
E System property setzten Allgemeine Java-Themen 8
Kirby.exe Movement System für Spiel Allgemeine Java-Themen 13
O Beziehung System.exit(x) <>Errorlevel Allgemeine Java-Themen 2
B System.out Ausgabe auf jtextarea Fehlersuche Allgemeine Java-Themen 8
F System Tray Menubutton ActionListener Allgemeine Java-Themen 5
H Im Tiled-Map-System ein Item anklicken Allgemeine Java-Themen 0
S Java Plugin System (ohne OSGI) Allgemeine Java-Themen 10
D System.arraycopy verhält sich seltsam Allgemeine Java-Themen 1
C Login System Allgemeine Java-Themen 19
A BufferedReader ohne System.in Allgemeine Java-Themen 9
VfL_Freak JDK installieren System-Property "user.dir" Allgemeine Java-Themen 6
J System.arraycopy ergibt anderes Resultat als for-loop Allgemeine Java-Themen 4
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
D Java System.out::println Allgemeine Java-Themen 1
D Methoden Java Applikation Die System Auslastung optimieren ? Allgemeine Java-Themen 7
S Ist Java ein geschlossenes System? Allgemeine Java-Themen 2
L Erste Schritte Suche Java Wiki System? Allgemeine Java-Themen 5
chuxXo System/JLayer Volume ändern Allgemeine Java-Themen 0
Neumi5694 System.out und System.err umleiten - NICHT im Quelltext Allgemeine Java-Themen 4
X System.out/err(Die Console) in JTextArea ausgeben Allgemeine Java-Themen 2
S Best Practice System.arrayCopy verändert Ziel-Array Allgemeine Java-Themen 2
A Methoden Der Sinn von system.out.print(); Allgemeine Java-Themen 9
A System freezes when trying to run external command from Java with wait for Allgemeine Java-Themen 3
A Java | Login-System Allgemeine Java-Themen 3
C System.out.print("") Compiler Fehler Allgemeine Java-Themen 2
Joew0815 Best Practice Wie am besten Plugin-System erstellen? Allgemeine Java-Themen 12
C System.in erhält Input von Tastatur. wo wird das festgelegt? Allgemeine Java-Themen 4
F Benachrichtigungs-System Webapp Java Servlet Allgemeine Java-Themen 10
M collection persistence system Allgemeine Java-Themen 4
V System.out.println an jeder Stelle im Projekt löschen Allgemeine Java-Themen 4
D System.out's in String speichern. Allgemeine Java-Themen 2
H Interpreter-Fehler ArrayIndexOutOfBoundsException bei System.arraycopy() Allgemeine Java-Themen 3
M System herausfinden Allgemeine Java-Themen 6
O Variablen System.getenv: Sinnlose Werte, Arrays?! Allgemeine Java-Themen 6
G java.exe in System 32. Hilfe!!! Allgemeine Java-Themen 8
R Methoden Tag System Problem Allgemeine Java-Themen 3
J System.out im GUI anzeigen Allgemeine Java-Themen 3
N System.exit(0/1) Allgemeine Java-Themen 3
F System.out.println mit log4j ersetzen Allgemeine Java-Themen 10
D System.LoadLibrary(..) - Programm stürzt ab Allgemeine Java-Themen 2
U Classpath DLLs mittels System.load() laden: Allgemeine Java-Themen 6
D Listener auf System.out.err / System.out.println Allgemeine Java-Themen 5
G Input/Output System.in "umbiegen" für junit-Test Allgemeine Java-Themen 4
Kr0e User management system Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben