[Java] Chatserverproblem #2

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Mr. Mouse, 19. Mai 2009 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 19. Mai 2009
    Chatserverproblem #2

    Heyho, also ich arbeite gerade an einem kleinen Chatsystem (server+client).

    Der Server besteht aus folgenden Klassen:

    User:
    Code:
    import if06.strukturen.*;
    
    public class User extends Item
    {
     
     private int id;
     private String name;
     private String ip;
     private int port;
     private String status;
    
     public User(String pIP, int pPort)
     {
     ip = pIP;
     port = pPort;
     }
     
     public int getID() {
     return id;
     }
     
     public String getName() {
     return name;
     }
     
     public String getIP() {
     return ip;
     }
     
     public int getPort() {
     return port;
     }
     
     public String getStatus() {
     return status;
     }
     
     public void setName(String pName) {
     name = pName;
     }
     
     public void setStatus(String pStatus) {
     status = pStatus;
     }
     
     public boolean isEqual(Item pItem) {
     return false;
     }
     
     public boolean isGreater(Item pItem) {
     return false;
     }
     
     public boolean isLess(Item pItem) {
     return false;
     }
    }
    
    NameServer:
    Code:
    import if06.strukturen.*;
    
    public class NameServer
    {
     
     OrderedTree names;
    
     public NameServer()
     {
     names = new OrderedTree();
     }
     
     public void addUser(String pIP, int pPort) {
     User a = new User(pIP, pPort);
     names.insertItem(a);
     }
     
     public void removeUser(String pIP, int pPort) {
     User r = new User(pIP, pPort);
     names.removeItem(r);
     }
     
     public User getUser(String pIP, int pPort) {
     User n = new User(pIP, pPort);
     return (User)names.searchItem(n);
     }
    }
    
    ChatServer:
    Code:
    import if06.netzwerk.*;
    import java.util.StringTokenizer;
    
    /** 
     * @author Marco Kretz
     * @version 17.05.2009
     */
    
    public class ChatServer extends Server {
    
     
     NameServer names = new NameServer();
    
     public ChatServer() {
     super(4711);
     }
     
     public void processNewConnection(String pClientIP, int pClientPort) {
     
     }
     
     public void processMessage(String pClientIP, int pClientPort, String pMessage) {
     if(pMessage.startsWith("*")) {
     if(pMessage.equals("*BYE*")) { // beendet die Verbindung
     this.send(pClientIP, pClientPort, "*** Auf Wiedersehen. ***");
     //this.sendToAll("=> "+namen.getName(pClientIP, pClientPort)+" hat den Chat verlassen.");
     this.closeConnection(pClientIP, pClientPort);
     }
     else if (pMessage.startsWith("*NAME*")) { // setzt den Namen des Clienten
     StringTokenizer st = new StringTokenizer(pMessage, "$");
     String name = st.nextToken();
     if(st.hasMoreTokens()) {
     name = st.nextToken();
     }
     else { name = "Unbekannt"; 
     }
     //if(names.getUser(pClientIP, pClientPort) != null) {
     String old = names.getUser(pClientIP, pClientPort).getName();
     names.getUser(pClientIP, pClientPort).setName(name);
     //this.sendToAll("=>"+old+" heisst jetzt "+names.getUser(pClientIP, pClientPort).getName());
     this.sendToAll("lol");
     //} else {
     // names.getUser(pClientIP, pClientPort).setName(name);
     // this.sendToAll("=>"+names.getUser(pClientIP, pClientPort).getName()+" hat sich angemeldet.");
     //}
     
     }
     else if(pMessage.equals("*HELLO*")) {
     names.addUser(pClientIP, pClientPort);
     }
    
     else if(pMessage.equals("*LIST*")) {
    
     } 
     else {
     this.send(pClientIP, pClientPort, "*** Ungueltiger Befehl ***");
     }
     }
     else {
     
     this.sendToAll(names.getUser(pClientIP, pClientPort).getName()+" : "+pMessage);
     }
     }
     
     public void processClosedConnection(String pClientIP, int pClientPort) { 
     this.sendToAll(names.getUser(pClientIP, pClientPort).getName()+"=> hat den Chat verlassen.");
     } 
     
    
    }
    Das gui ist ja erstmal egal..so, wenn ich nun aber mit dem clienten *NAME*$test sende, kriege ich nur ne NullPointerException.. einer ne Ahnung woran das liegen könnte ?

    der fehler muss irgendwo bei dem *NAME* command in processMassage sein
     
  2. 19. Mai 2009
    AW: Chatserverproblem #2

    hi,

    wäre nicht schlecht, wenn du genau deine exception beschreibst, bzw. mal den output postest. macht sich um einiges leichter. ;-)

    ich weiß nicht ob das schon so war, aber warum hast du die bedingung herausgenommen (auskommentiert)?.

    denn diese überprüft, ob es die Clientip und den Clientport schon gibt. falls es nicht der fall ist, wird dieser neu angelegt in names.

    ich vermute, dass er die exception wirft, dass es test nicht gibt. dieser dann in name gespeichert wird.

    Code:
    names.getUser(pClientIP, pClientPort).setName(name);
    
    hoffe du verstehst, was ich meine ;-)
     
  3. 19. Mai 2009
    AW: Chatserverproblem #2

    hey haste nich nen kleinen denkfehler hier im code:

    Code:
    String name = st.nextToken();[B] <- hier holste dir den ersten Token bei deinem Beispiel test[/B]
    if(st.hasMoreTokens()) { [B]<- sollte ja jetzt false sein, da ja nur test drinne steht[/B]
     name = st.nextToken(); [B]<- passiert also nur wenn da 2 namen übergeben werden was ja eig unsinn ist oder ?[/B]
    }
     else { name = "Unbekannt"; [B]<- Bei unserem beispiel wird Unbekannt zugeordnet[/B]
    }
    
    jedoch muss dein Fehler schon iwo davor sein da du ja ne NullPointerException hast. Es könnte sein das dein *NAME* die probs macht da ja dein delimiter da nich davor steht. Ne genau line wo der fehler auftritt wäre toll
     
  4. 19. Mai 2009
    AW: Chatserverproblem #2

    @SchOudeBläS
    da kann ich dir leider nicht zustimmen.

    denn in nextToken(); steht *Name* und somit wird die bedingung ausgeführt.

    und der konstruktor sieht ja wie folgt aus:
    StringTokenizer st = new StringTokenizer(pMessage, "$");
    somit erhält er als namen test.
     
  5. 19. Mai 2009
    AW: Chatserverproblem #2

    also da mit dem namen ist schon richtig. ich weiss wo das problem ist..
    ich habe alle "User" Objekte in einem BinTree

    mit der Funktion searchItem(Item pItem) kann ich mir das Item holen.
    jez kommt das Problem:

    Wenn ich einen "User" in dem Baum haben User(name, ip, port) und mir nun den namen holen will, müsste ich das ja folgendermaßen machen:

    Code:
    public String getName(String pIP, int pPort) {
     User s = (User)bintree.searchItem(new User(pIP, pPort));
     return s.getName();
    }
    das geht aber nicht, weil er sagt, dass es das objekt nicht gibt, weil ich kein Userobjekt mit namen erzeuge.. deswegen die NullPointerExeption

    aber wie komme ich an den namen nur durch die IP und den Port ?

    bitte keine tipps wie datenbank benutzten, oder List, oder ArrayList oder so^^
     
  6. 19. Mai 2009
    AW: Chatserverproblem #2

    doofe frage.
    bevor du überhaupt was suchen kannst, musst du es nicht deinem BinTree hinzuzufügen???
    mal ganz davon abgesehen, habe ich keine ahnung, was ein bintree ist. habe ich bis heute noch nie gehört. in welcher java version wird das verwendet???
     
  7. 19. Mai 2009
    AW: Chatserverproblem #2

    ist schon eingefügt.. google halt mal

    okay, abgesehen von nem Binärbaum, was hätte ich noch für Möglichkeiten die Objekte abzulegen, so das ich sie nacher leicht durchsuchen und abrufen kann ?
     
  8. 19. Mai 2009
    AW: Chatserverproblem #2

    wie wäre es mit einer Hashmap:

    Code:
    HashMap<String,User> users = new HashMap<String,User> ();
    
    da kriegst halt dann mit dem schlüssel (z.b. dem usernamen) sofort dein Objekt, kannst sie aber nicht durchsuchen. Geht aber dafür schnell und ohne viel Overhead.

    hab jetzt aber auch nicht den ganzen Text gelesen, aber um auf Serverseite etwas nachzuschlagen mit einer gegebenen eindeutigen Info, ist eine HashMap die erste Wahl.

    Wobei ich noch nicht ganz verstanden habe, was du eigentlich mit deinem Server machen willst und vor allem was dein Nameserver machen soll. Wenn du dir nur die User die angemeldet sind merken willst, würde eine LinkedList doch völlig ausreichen. Kommt aber dann auch wieder auf deinen Verwendungszweck an.
    Aber ein Binärbaum ist da übertrieben, zwar haste bei einer Suche schneller en Treffer, aber das lohnt sich erst bei en paar paar hundert Einträgen und mehr und soviel user werden wohl nicht in deinen chat kommen.
     
  9. 19. Mai 2009
    AW: Chatserverproblem #2

    Okay, ich habe mal eine neue Version gebastelt:

    User:
    Code:
    public class User {
    
     private String name;
     private String ip;
     private String status;
     private String id;
     private int port;
     
     public User(String pName, String pIP, int pPort) {
     
     ip = pIP;
     port = pPort;
     name = pName;
     status = "online";
     id = pIP+pPort;
     }
     
     public String getName() {
     return name;
     }
     
     public String getIP() {
     return ip;
     }
     
     public String getID() {
     return id;
     }
     
     public String getStatus() {
     return status;
     }
     
     public int getPort() {
     return port;
     }
     
     public void setName(String pName) {
     name = pName;
     }
    }
    NameServer:
    Code:
    import java.util.HashMap;
    
    public class NameServer {
     
     HashMap<String,User> users = new HashMap<String,User>();
     
     public void addUser(String pName, String pIP, int pPort) {
     User n = new User(pName, pIP, pPort);
     users.put(pIP+pPort, n);
     }
     
     public void removeUser(String pIP, int pPort) {
     if(users.containsKey(pIP+pPort)) {
     users.remove(pIP+pPort);
     }
     }
     
     public String getName(String pKey) {
     String name = "Unknown";
     if(users.containsKey(pKey)) {
     User n = users.get(pKey);
     name = n.getName();
     }
     return name;
     }
     
     public boolean keyCheck(String key) {
     boolean check = false;
     if(users.containsKey(key)) {
     check = true;
     } else { check = false; }
     return check;
     }
     
     public void setName(String pKey, String pName) {
     if(users.containsKey(pKey)) {
     users.get(pKey).setName(pName);
     }
     }
    }
    
    Server:
    Code:
    import java.util.StringTokenizer;
    
    import if06.netzwerk.*;
    
    public class ChatServer extends Server {
     
     private NameServer names;
     
     public ChatServer() {
     super(4711);
     names = new NameServer();
     }
     
     public void processMessage(String pIP, int pPort, String pMessage) {
     if(pMessage.startsWith("*")) {
     if(pMessage.equals("*HELLO*")) {
     this.send(pIP, pPort, "*** Willkommen ***");
     } else if(pMessage.equals("*BYE*")) {
     
     } else if(pMessage.equals("*LIST*")) {
     
     } else if(pMessage.startsWith("*NAME")) {
     StringTokenizer s = new StringTokenizer(pMessage, "$");
     String name = s.nextToken();
     if(s.hasMoreTokens()) {
     name = s.nextToken();
     } else { name = "unknown"; }
     
     if(names.keyCheck(pIP+pPort)) {
     names.setName(pPort+pIP, name);
     } else {
     names.addUser(name, pIP, pPort);
     }
     } 
     } else {
     this.sendToAll(names.getName(pIP+pPort)+": "+pMessage);
     } 
     }
     
     public void processClosedConnection(String pIP, int pPort) {
     
     }
    
    }
    
    finzt auch, nur das mit dem namen ändern geht iwie net.
    wenn ich den befehl "*NAME*$test" sende ändert er den namen nicht, grund ?
     
  10. 19. Mai 2009
    AW: Chatserverproblem #2

    Okay hab die Lösung selber herrausgefunden, einfach den User aus der map löschen und mit neuem namen wieder einfügen
     
  11. 20. Mai 2009
    AW: Chatserverproblem #2

    erledigt?
    closed
     
  12. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.