Portal > Foren > Java > Allgemeine Java-Programmierung > String auf Befehlen und Argumenten verarbeiten
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 15.01.2006, 16:27 Nach oben    #1
Neuer Benutzer
 
Registriert seit: 14.12.2005
Beiträge: 11
Standard String auf Befehlen und Argumenten verarbeiten

Hi
in welchem format sollte man Strings verschicken und wie kann man die dann auswerten?

im Moment schick ich z.B. ein create:file:testdatei.txt
oder ein create:folder:testordner
oder sowas wie nachrichtlli:hallo wie gehts?

und je nachdem was drinsteht soll er halt machen...

problem ist aber wenn da in der nachricht ein : drin steht dann kommt der interpreter ja total durcheinander... und wenn nach olli nix mehr kommt wei lman vergessen hat die nachricht anzugeben gibts ne Exception wenn man das nicht in jeder if schleife prüft (kann ja verschiedenen befehle geben mit unterschiedlich vielen nachfolgenden strings...)

wie macht man das am besten?
__________________
^^
relax ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.01.2006, 16:33 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Äh, wie schickst Du was wohin?
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.01.2006, 17:05 Nach oben    #3
Neuer Benutzer
 
Registriert seit: 14.12.2005
Beiträge: 11
Standard

spielt ja eigentlich keine rolle, vom clienten zum server.

oder von der main klasse zur interpreter klasse... wie gesagt, eagl
__________________
^^
relax ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.01.2006, 17:18 Nach oben    #4
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.134
Standard

Escape doch einfach die Sonderzeichen, d.h. "\" gefolgt von ":" ist kein Separator.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.01.2006, 17:41 Nach oben    #5
Neuer Benutzer
 
Registriert seit: 14.12.2005
Beiträge: 11
Standard

Zitat:
Zitat von pago
Escape doch einfach die Sonderzeichen, d.h. "\" gefolgt von ":" ist kein Separator.
ist ein oder ist kein?

schön und gut aber da ist dann noch das problem wie ich das ganze verarbeite
__________________
^^
relax ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.01.2006, 17:55 Nach oben    #6
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.134
Standard

Ist kein.
Wie du das verarbeitest musst du selber wissen. Ein Beispiel wäre, dass du zuerst das erste Kommando aufschlüsselst ("create"), dann guckst, was erzeugt werden soll ("folder") und dann, wie er heißen soll ("testordner").
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.01.2006, 18:26 Nach oben    #7
Neuer Benutzer
 
Registriert seit: 14.12.2005
Beiträge: 11
Standard

Zitat:
Zitat von pago
Ist kein.
Wie du das verarbeitest musst du selber wissen. Ein Beispiel wäre, dass du zuerst das erste Kommando aufschlüsselst ("create"), dann guckst, was erzeugt werden soll ("folder") und dann, wie er heißen soll ("testordner").
genauso mach ich es ja im moment...

aber guck doch nochmal in meinen ersten post. ich schrieb da noch was von StringTokenizer und Exceptions..
__________________
^^
relax ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.01.2006, 18:30 Nach oben    #8
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.134
Standard

Von StringTokenizer stand da nix.
Würde ich dafür aber auch nicht verwenden. Ein einfaches String.split ist da viel effektiver.

Du musst halt gucken, ob's noch nen Token gibt, wenn nicht: Fehlermeldung.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.01.2006, 22:10 Nach oben    #9
Neuer Benutzer
 
Registriert seit: 02.09.2004
Beiträge: 22
Standard

Hallo Relax!

Ein Problem am StringTokenizer ist, dass aufeinanderfolgende Trennzeichen nicht als leeres Feld erkannt werden, vielleicht ist das ja Dein Problem.

Gruss!
Franz
franz77 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.01.2006, 22:44 Nach oben    #10
Neuer Benutzer
 
Registriert seit: 14.12.2005
Beiträge: 11
Standard

Nein nein nein

Schaut mal wie ich es bisher mache...

der thread holt sich daten ausm socket...
PHP-Code:
            while((tempIn in.readLine()) != null) {
                if(
tempIn.length() > 0) {
                    
tok = new StringTokenizer(tempIn"|");
                    
tempArguments.clear();
                    while(
tok.hasMoreTokens()) {
                        
tempArguments.add(tok.nextToken());
                    }
                    
parser.parse(tempArgumentsthis);
                }
            } 
und übergibt die arraylist meiner parser klasse:
PHP-Code:
import java.util.*;

public class 
Parser {
    
ArrayList<StringtempArguments;
    
ChannelList channelList;
    
ClientList clientList;
    
Client client;
    
    public 
Parser(ChannelList channelListClientList clientList) {
        
this.tempArguments = new ArrayList<String>();
        
this.channelList channelList;
        
this.clientList clientList;
    }
    
    public 
void parse(ArrayList<StringtempArgumentsClient client) {
        if(
tempArguments.get(0).equals("join_channel")) {
            
channelList.joinChannel(tempArguments.get(1), client);
        }
        else if(
tempArguments.get(0).equals("leave_channel")) {
            
channelList.leaveChannel(tempArguments.get(1), client);
        }
        else if(
tempArguments.get(0).equals("set_nick")) {
            
client.setNick(tempArguments.get(1));
        }
        else if(
tempArguments.get(0).equals("message_channel")) {
            
channelList.getChannel(tempArguments.get(1)).sendMessage(tempArguments.get(2), client.nick);
        }
        else if(
tempArguments.get(0).equals("message_user")) {
            
clientList.getClient(tempArguments.get(1)).sendMessage("message|user|" tempArguments.get(2) + "|" client.nick);
            
client.sendMessage("message|user|" tempArguments.get(2) + "|" client.nick);
        }
        else if(
tempArguments.get(0).equals("available_clients")) {
            
clientList.printClientlist(client);
        }
        else if(
tempArguments.get(0).equals("available_channels")) {
            
channelList.printChannellist(client);
        }
        else if(
tempArguments.get(0).equals("clients_ops_in_channel")) {
            
channelList.getChannel(tempArguments.get(1)).printClientList(client);
            
channelList.getChannel(tempArguments.get(1)).printOpList(client);
        }
        else if(
tempArguments.get(0).equals("kick_in_channel")) {
            if(
tempArguments.size() == 3) {
                
channelList.getChannel(tempArguments.get(1)).kick(clientList.getClient(tempArguments.get(2)), client);
            } else {
                
channelList.getChannel(tempArguments.get(1)).kick(clientList.getClient(tempArguments.get(2)), clienttempArguments.get(3));
            }
        }
    }

Probleme:
1. Ich muss für JEDEN if-Zwei 100000000 Abfragen machen ob der und der Slot gefüllt ist... (noch nicht gemacht, wäre ja auch irgendwie bissel heftig nicht?)
2. Username und Nachricht darf kein | enthalten, weil | = tokenizertrennzeichen...
__________________
^^
relax ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.01.2006, 23:27 Nach oben    #11
Neuer Benutzer
 
Registriert seit: 02.09.2004
Beiträge: 22
Standard

Hi!

Ja da hilft wirklich nur escapen. Ein : kann nicht gleichzeitig Steuerzeichen und Textzeichen sein, das geht auf keinen Fall!

Gruss!
Franz!
franz77 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.01.2006, 23:48 Nach oben    #12
Neuer Benutzer
 
Registriert seit: 14.12.2005
Beiträge: 11
Standard

wie meinst du das mit escapen?

"\n"?
message\nhallo

würde dann doch schon beim readLine() getrennt werden?!

Und außerdem, es besteht immernoch das Prob das ich danach noch 1000000 abfragen machen müsste wegen, ist slot 3 gefüllt etc...
__________________
^^
relax ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2006, 09:20 Nach oben    #13
Neuer Benutzer
 
Registriert seit: 02.09.2004
Beiträge: 22
Standard

Hi!

Escapen heisst, dass die Steuerzeichen in irgendeiner Art und Weise maskiert werden. Zum Beispiel wie mit dem Backslash in Java Strings, denn es muss ja klar werden, dass der Backslash nicht als Steuerzeichen sondern als Textzeichen gemeint ist:

Code:
System.out.println("Das ist ein Zeilenvorschub \\n");
würde folgendes Ausgeben:
Das ist ein Zeilenvorschub \n

Code:
System.out.println("Das ist ein Zeilenvorschub \n");
würde folgendes ausgeben:
Das ist ein Zeilenvorschub
(hier eine zusätzliche Leerzeile)


Wegen den 1000000 Ifs habe ich gerade auch keine Lösung. (Du meinst damit, dass Du in jeder else if Anweisung auch die 2. und 3. Parameter einzeln prüfen musst???? Evtl. lässt sich die lange else if liste umgehen, aber Arbeit ist das in jedem Fall, so lange Du auf die Überprüfung nicht Verzichten willst.)

Gruss!
Franz
franz77 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2006, 12:28 Nach oben    #14
Erfahrener Benutzer
 
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
Standard

wenn die verbindung von einem java server zu einem java clienten geht,
hätte ich einen vorschlag, mit dem du dir die ganze parser arbeit ersparen könntest...

du schickst die befehle warscheinlich über einen einfachen OutputStream, am anderen ende wird durch einen InputStream der befehl wieder eingelesen und geparst...

mein vorschlag, auf beiden seiten auf die Streams einen ObjectStream erstellen,
dann kannst du dir kleine java objekte wie z.B. Befehl,Nachricht erstellen. Diese Objekte müssen das interface Serializable implementieren,
danach kann man sie bequem über den ObjectStream verschicken und wieder empfangen.
auf server seite sieht das etwa so aus
Code:
ObjectOutputStream oOut = new ObjectOutputStream(outputStream);

obj1 = new Nachricht('beny','guest1','hallo, was geht ab?');
obj2 = new Befehl('create','file','test.txt');

try{
 oOut.writeObject(obj1);
 oOut.writeObject(obj2);
} catch(Exception e){
 e.printStackTrace();
}
und auf clientseite
Code:
ObjectInputStream oIn = new ObjectInputStream(inputStream);

obj = oIn.readObject();
if(obj instanceof Befehl){
 Befehl command = (Befehl)obj;
 System.out.println("befehl empfangen ".command.getName());
} else if(obj instanceof Nachricht){
 Nachricht msg = (Nachricht)obj;
 System.out.println("nachricht empfangen ".command.getText());
}
beny_mcde ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2006, 13:26 Nach oben    #15
Neuer Benutzer
 
Registriert seit: 14.12.2005
Beiträge: 11
Standard

Zitat:
Zitat von franz77
Wegen den 1000000 Ifs habe ich gerade auch keine Lösung. (Du meinst damit, dass Du in jeder else if Anweisung auch die 2. und 3. Parameter einzeln prüfen musst????
ja, prüfen ob ein 2. 3. 4. etc Parameter vorliegt wenn benötigt denn sonst kommt es ja zu einer exception wenn ich arraylist.get(4) an eine funktion schicke und aber index 4 null ist...

Zitat:
Zitat von beny_mcde
...
sieht interessant aus, aber auch ziemlich wirr und für ein größeres Projekt zu fusselig. Außerdem will ich nicht-Java Programmieren nicht zumuten erst Java zu lernen um den Clienten zu schreiben.


In einem anderen Forum hat man mir den Tipp gegeben mich mal wegen RMI schlau zu machen, damit lassen sich, nachdem was ich beisher gelesen habe, funktionen von objekten auf dem server einfach vom clienten aufrufen über "middleware" als wenn die funktionen lokal verfügbar wären.
__________________
^^
relax ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2006, 13:56 Nach oben    #16
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.134
Standard

Du könntest auch einfach mal OOP lernen...

Code:
public interface Command {
	public void invoke(String cmd);
}

public class CommandChain implements Command {
	private Map commands;
	
	public CommandChain() {
		commands = new HashMap();
	}
	
	public void invoke(String cmd) {
		if(cmd == null) {
			return;
		}
		int idx = findEscapedIndex(cmd, 0);
		Command command = null;
		if(idx != -1) {
			String currentCommand = cmd.substring(0, idx);
			cmd = cmd.substring(idx+1);
			command = (Command)commands.get(currentCommand);
		} else {
			command = (Command)commands.get(cmd);
		}
		if(command != null) {
			command.invoke(cmd);
		}
	}
	
	private int findEscapedIndex(String cmd, int from) {
		int index = cmd.indexOf(':');
		if(index == -1) {
			return -1;
		}
		if(index > 0 && cmd.charAt(index-1) == '\\') {
			return findEscapedIndex(cmd, index+1);
		}
		return index;
	}
	
	public void register(String cmd, Command command) {
		commands.put(cmd, command);
	}
}

// Benutzung
Command chain = new CommandChain();
chain.register("create", new CreateCommandChain());
chain.invoke("create:folder:test");
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.01.2006, 09:47 Nach oben    #17
Erfahrener Benutzer
 
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
Standard

Zitat:
Zitat von relax
sieht interessant aus, aber auch ziemlich wirr und für ein größeres Projekt zu fusselig. Außerdem will ich nicht-Java Programmieren nicht zumuten erst Java zu lernen um den Clienten zu schreiben.
In einem anderen Forum hat man mir den Tipp gegeben mich mal wegen RMI schlau zu machen, damit lassen sich, nachdem was ich beisher gelesen habe, funktionen von objekten auf dem server einfach vom clienten aufrufen über "middleware" als wenn die funktionen lokal verfügbar wären.
rmi funktioniert meines wissens aber auch nur von java zu java...
wenn du es richtig unabhängig willst, verwende z.B. SOAP.

wieso findest du es wirr? du darfst das auch nicht als richtiges programm sehen, sondern mehr als eine idee, ein anstoß oder ein geistesblitz, der aus meinem kopf über die tastatur direkt hier ins forum gelangt ist...
währ das ganze über meine ide gegangen würde es vieleicht besser aussehen, aber das hätte mich auch mehr zeit gekostet.

und für ein größeres projekt ist das auf jedenfall unfuseliger als dein parser.
um so mehr verschiedene befehle du einbaust, um so länger wird deine if else kette in der Parser klasse und du siehst ja selber das ein einfaches anführungszeichen schon alles durcheinander bringen kann

für die clientseite hätte ich noch folgende änderungen vorzuschlagen.


Code:
Map commandTypes = new HashMap();
 commandTypes.put(Befehl.class,new BefehlsAuswerter());
 commandTypes.put(Nachricht.class,new NachrichtenAuswerter());


ObjectInputStream oIn = new ObjectInputStream(inputStream);
 obj = oIn.readObject();

Auswerter a = commandTypes.get(obj.getClass());
if(a==null){
 System.out.println("Unbekannter befehl empfangen: "+obj.getClass().getName());
} else{
 a.befehlAuswerten(obj);
}
hier währe auch eine gute stelle um pagos CommandChain einzubauen...
beny_mcde ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
string auf @ überprüfen Garnele PHP-Programmierung 17 06.02.2007 18:16
Problem bei Verarbeitung von Templates (Eigene Klassen) dago PHP-Programmierung 21 31.08.2006 16:02
XML aus Datenbank lesen, verarbeiten Robinson HTML, XML und CSS 5 27.12.2005 20:30
Textfelder auf verschiedenen Tabs per Observer synchronisieren Sayang Desktop-Applikationen und Grafik 2 05.12.2005 19:14
Datei einlesen. cyberdevil87 Allgemeine Java-Programmierung 3 27.06.2005 09:22


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:16 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45