# Java Chat Admin Kenzeichnung



## ChameleoN (26. Jul 2014)

Hallo,

Ich habe aus Google einen Source code von einem Client/server chat genommen und den code ein bisschen verändert nun Wie stelle ich ein das  wenn sich ein Admin einloggt er in rot schreibt und einem [Admin] vor seinem namen hat.  So sieht die message.java im moment aus 
Tut mir leid wenn ich mich undeutlich ausdrücke bin sehr neu in Java 


```
package com.socket;

import java.io.Serializable;

public class Message implements Serializable{
    private static final long serialVersionUID = 1L;
    public String type, sender, content, recipient;
    
    public Message(String type, String sender, String content, String recipient){
        this.type = type; this.sender = sender; this.content = content; this.recipient = recipient;
    }
    
    @Override
    public String toString(){
        return "{type='"+type+"', sender='"+sender+"', content='"+content+"', recipient='"+recipient+"'}";
    }
}
```













Die Nachricht Soll komplett rot sein wenn der Admin Sie Sie schreibt


----------



## TiGreen (26. Jul 2014)

Also ich würde mal vermuten fürs [Admin] kannst du einfach den QC so ändern.
Wenn du fortgeschrittener bist, kannst du dir auch vom Server geben lassen wer als Admin gekennzeichnet werden soll - das wäre dann noch sauberer gelöst, aber für den Anfänger wird das schon reichen..


```
public Message(String type, String sender, String content, String recipient){
        this.type = type;
        if(sender.toLowerCase().equals("chameleon") { // Also wenn du dich nur als "chameleon" anmeldest müsste das "[Admin] " vor deinem Namen auftauchen
              this.sender = "[Admin] " + sender;
        } else {
              this.sender = sender;
        }
        this.content = content;
        this.recipient = recipient;
    }
```

Das mit der Farbe musst du schon woanders im QC implementieren und das wird für einen Einsteiger etwas schwieriger umzusetzen zu sein.


----------



## ChameleoN (26. Jul 2014)

Erstmal Danke Für deine Antwort.
Wenn ich den Text so übernehme 
	
	
	
	





```
import java.io.Serializable;
     
    public class Message implements Serializable{
        
        private static final long serialVersionUID = 1L;
        public String type, sender, content, recipient;
       
        public Message(String type, String sender, String content, String recipient){
            this.type = type; this.sender = sender; this.content = content; this.recipient = recipient;
              if(sender.toLowerCase().equals("chameleon") 
                      )
              this.sender = "[Admin] " + sender;
         else {
              this.sender = sender;
        }
        this.content = content;
        this.recipient = recipient;
          }
        }
```
Kann Sich der user "chameleon" nicht mehr Anmelden und bekommt ein "Login Failed"
Ich Denke das liegt an der Datenbank des server aber genau weiß ich es nicht.




Und wenn ich fragen Darf wie wäre Das mit dem code für dem Server. Das wäre mir dann doch lieber
Das ist die message.java vom server 

```
package com.socket;

import java.io.Serializable;

public class Message implements Serializable{
    
    private static final long serialVersionUID = 1L;
    public String type, sender, content, recipient;
    
    public Message(String type, String sender, String content, String recipient){
        this.type = type; this.sender = sender; this.content = content; this.recipient = recipient;
    }
    
    @Override
    public String toString(){
        return "{type='"+type+"', sender='"+sender+"', content='"+content+"', recipient='"+recipient+"'}";
    }
}
```


----------



## cybren (26. Jul 2014)

Hey wie fügst du denn den Namen desjenigen der schirebt hinzu? 
ist das wo die Nachichten erscheinen ein JTextfield oder ein JPannel wo du dann nur JLabel hinzufügst?


----------



## TiGreen (26. Jul 2014)

Hmmm ok die Klasse die bringt uns wohl nicht weiter, du musst dann wohl den ganzen Source Code geben oder den richtigen Teil wo die ganzen Labels und Textfelder erstellt werden.


----------



## ChameleoN (26. Jul 2014)

Ich hänge mal den source ordner an die datenbank ist ein XML-Dokument welches sich auch im source ordner befindet.Die benutzer werden dort mit einem passwort eingetragen
villeicht hilft ja die socketClient.java 


```
package com.socket;

import com.ui.ChatFrame;
import java.io.*;
import java.net.*;
import java.util.Date;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

public class SocketClient implements Runnable{
    
    public int port;
    public String serverAddr;
    public Socket socket;
    public ChatFrame ui;
    public ObjectInputStream In;
    public ObjectOutputStream Out;
    public History hist;
    
    public SocketClient(ChatFrame frame) throws IOException{
        ui = frame; this.serverAddr = ui.serverAddr; this.port = ui.port;
        socket = new Socket(InetAddress.getByName(serverAddr), port);
            
        Out = new ObjectOutputStream(socket.getOutputStream());
        Out.flush();
        In = new ObjectInputStream(socket.getInputStream());
        
        hist = ui.hist;
    }

    @Override
    public void run() {
        boolean keepRunning = true;
        while(keepRunning){
            try {
                Message msg = (Message) In.readObject();
                System.out.println("Incoming : "+msg.toString());
                
                if(msg.type.equals("message")){
                    if(msg.recipient.equals(ui.username)){
                        ui.jTextArea1.append("["+msg.sender +" > Me] : " + msg.content + "\n");                        
                    }
                    else{
                        ui.jTextArea1.append("["+ msg.sender +" > "+ msg.recipient +"] : " + msg.content + "\n");
                    }
                                            
                    if(!msg.content.equals(".bye") && !msg.sender.equals(ui.username)){
                        String msgTime = (new Date()).toString();
                        
                        try{
                            hist.addMessage(msg, msgTime);
                            DefaultTableModel table = (DefaultTableModel) ui.historyFrame.jTable1.getModel();
                            table.addRow(new Object[]{msg.sender, msg.content, "Me", msgTime});
                        }
                        catch(Exception ex){}  
                    }
                }
                else if(msg.type.equals("login")){
                    if(msg.content.equals("TRUE")){
                        ui.jButton2.setEnabled(false); ui.jButton3.setEnabled(false);                        
                        ui.jButton4.setEnabled(true); ui.jButton5.setEnabled(true);
                        ui.jTextArea1.append("[SERVER > Me] : Login Successful\n");
                        ui.jTextField3.setEnabled(false); ui.jPasswordField1.setEnabled(false);
                    }
                    else{
                        ui.jTextArea1.append("[SERVER > Me] : Login Failed\n");
                    }
                }
                else if(msg.type.equals("test")){
                    ui.jButton1.setEnabled(false);
                    ui.jButton2.setEnabled(true); ui.jButton3.setEnabled(true);
                    ui.jTextField3.setEnabled(true); ui.jPasswordField1.setEnabled(true);
                    ui.jTextField1.setEditable(false); ui.jTextField2.setEditable(false);
                    ui.jButton7.setEnabled(true);
                }
                else if(msg.type.equals("newuser")){
                    if(!msg.content.equals(ui.username)){
                        boolean exists = false;
                        for(int i = 0; i < ui.model.getSize(); i++){
                            if(ui.model.getElementAt(i).equals(msg.content)){
                                exists = true; break;
                            }
                        }
                        if(!exists){ ui.model.addElement(msg.content); }
                    }
                }
                else if(msg.type.equals("signup")){
                    if(msg.content.equals("TRUE")){
                        ui.jButton2.setEnabled(false); ui.jButton3.setEnabled(false);
                        ui.jButton4.setEnabled(true); ui.jButton5.setEnabled(true);
                        ui.jTextArea1.append("[SERVER > Me] : Singup Successful\n");
                    }
                    else{
                        ui.jTextArea1.append("[SERVER > Me] : Signup Failed\n");
                    }
                }
                else if(msg.type.equals("signout")){
                    if(msg.content.equals(ui.username)){
                        ui.jTextArea1.append("["+ msg.sender +" > Me] : Bye\n");
                        ui.jButton1.setEnabled(true); ui.jButton4.setEnabled(false); 
                        ui.jTextField1.setEditable(true); ui.jTextField2.setEditable(true);
                        
                        for(int i = 1; i < ui.model.size(); i++){
                            ui.model.removeElementAt(i);
                        }
                        
                        ui.clientThread.stop();
                    }
                    else{
                        ui.model.removeElement(msg.content);
                        ui.jTextArea1.append("["+ msg.sender +" > All] : "+ msg.content +" has signed out\n");
                    }
                }
                else if(msg.type.equals("upload_req")){
                    
                    if(JOptionPane.showConfirmDialog(ui, ("Accept '"+msg.content+"' from "+msg.sender+" ?")) == 0){
                        
                        JFileChooser jf = new JFileChooser();
                        jf.setSelectedFile(new File(msg.content));
                        int returnVal = jf.showSaveDialog(ui);
                       
                        String saveTo = jf.getSelectedFile().getPath();
                        if(saveTo != null && returnVal == JFileChooser.APPROVE_OPTION){
                            Download dwn = new Download(saveTo, ui);
                            Thread t = new Thread(dwn);
                            t.start();
                            //send(new Message("upload_res", (""+InetAddress.getLocalHost().getHostAddress()), (""+dwn.port), msg.sender));
                            send(new Message("upload_res", ui.username, (""+dwn.port), msg.sender));
                        }
                        else{
                            send(new Message("upload_res", ui.username, "NO", msg.sender));
                        }
                    }
                    else{
                        send(new Message("upload_res", ui.username, "NO", msg.sender));
                    }
                }
                else if(msg.type.equals("upload_res")){
                    if(!msg.content.equals("NO")){
                        int port  = Integer.parseInt(msg.content);
                        String addr = msg.sender;
                        
                        ui.jButton5.setEnabled(false); ui.jButton6.setEnabled(false);
                        Upload upl = new Upload(addr, port, ui.file, ui);
                        Thread t = new Thread(upl);
                        t.start();
                    }
                    else{
                        ui.jTextArea1.append("[SERVER > Me] : "+msg.sender+" rejected file request\n");
                    }
                }
                else{
                    ui.jTextArea1.append("[SERVER > Me] : Unknown message type\n");
                }
            }
            catch(Exception ex) {
                keepRunning = false;
                ui.jTextArea1.append("[Application > Me] : Connection Failure\n");
                ui.jButton1.setEnabled(true); ui.jTextField1.setEditable(true); ui.jTextField2.setEditable(true);
                ui.jButton4.setEnabled(false); ui.jButton5.setEnabled(false); ui.jButton5.setEnabled(false);
                
                for(int i = 1; i < ui.model.size(); i++){
                    ui.model.removeElementAt(i);
                }
                
                ui.clientThread.stop();
                
                System.out.println("Exception SocketClient run()");
                ex.printStackTrace();
            }
        }
    }
    
    public void send(Message msg){
        try {
            Out.writeObject(msg);
            Out.flush();
            System.out.println("Outgoing : "+msg.toString());
            
            if(msg.type.equals("message") && !msg.content.equals(".bye")){
                String msgTime = (new Date()).toString();
                try{
                    hist.addMessage(msg, msgTime);               
                    DefaultTableModel table = (DefaultTableModel) ui.historyFrame.jTable1.getModel();
                    table.addRow(new Object[]{"Me", msg.content, msg.recipient, msgTime});
                }
                catch(Exception ex){}
            }
        } 
        catch (IOException ex) {
            System.out.println("Exception SocketClient send()");
        }
    }
    
    public void closeThread(Thread t){
        t = null;
    }
}
```


----------



## TiGreen (26. Jul 2014)

Ändere erstmal das was ich dir vorher geschrieben habe wieder um zu dem was am Anfang war.
(also ohne .equals("chameleon") ..)

Hier so musst den SourceCode anpassen.. So werden Absender und Empfänger den <Admin> Tag bekommen. Hoffe diesmal klappts 
@SocketClient::run()

```
if (msg.type.equals("message")) {
            if (msg.recipient.equals(ui.username)) {
                ui.jTextArea1.append("[" + isUserAdmin(msg.sender) + " > Me] : " + msg.content + "\n");
            } else {
                ui.jTextArea1.append("[" + isUserAdmin(msg.sender) + " > " + isUserAdmin(msg.recipient) + "] : " + msg.content + "\n");
            }
            // ... weiterer SourceCode
}
```

Und die Methode müsstest du dann in die selber Klasse tun.

```
private String isUserAdmin(String name) {
        if(name.toLowerCase().equals("chameleon") || name.toLowerCase().equals("weitereradmin")) {
            return "<Admin> " + name;
        }
        return name;
    }
```


----------



## Anti-Banane (26. Jul 2014)

ohne mir jetzt das source-archiv angesehen zu haben wird doch wohl aus der code-änderung klar das die klasse Message sowohl von server als auch client genutzt wird um daten zu übertragen ...

ergo : es werden auch die informationen genutzt die da drin stehen

wenn du jetzt den code so änderst das bei einem bestimmten user-namen dieser verändert wird kommt auch nur dieser veränderte user beim server an

um es zu verdeutlichen

du schreibst "user" in die message rein
die klasse reagiert darauf und macht dann daraus "[admin] user"
der server kann nach erhalt der message nur noch "[admin] user" rauslesen und versucht dies in der datenbank zu finden ... was es aber nicht gibt sondern nur "user"


ergo : änderung der Message-klasse ist hier definitiv falsch

korrekt müsste es eher so laufen das entsprechend schon auf dem server klar ist wer admin ist und wer nicht ... kann man über ein flag steuern ...

bezüglich user-liste / user-name im chat : muss vom server aus kommen
bezüglich der roten farbe : hier wird es schon etwas schwieriger weil man nicht einfach eine zeile rot machen kann ... man müsste das ganze mit nem eigenen renderer aufbauen der dann angesteuert wird um halt die admin-message rot hervorzuheben


aus deiner aussage schließe ich das das hier wohl eher nur copy'n'paste ist und du so an sich scheinbar gar keine ahnung von java hast

zwei möglichkeiten :
1) wenn du willst dann solltest du java von anfang an lernen und nicht irgendwo mitten drin reinspringen
2) wenn du nur das end-produkt nutzen dich aber so nicht weiter mit java beschäftigen willst gib es an jemanden der sich mit auskennt und lasse von diesem deine änderungswünsche umsetzen ... bzw : wende dich direkt an den original-autor des codes


----------



## ChameleoN (26. Jul 2014)

TiGreen tut mir leid aber ich verstehe grade überhaut nichgt wie du das meinst kannst du das noch mal einfacher erklären.


----------



## TiGreen (26. Jul 2014)

Okay also du hast ja die Klasse *SocketClient * dort gibt es eine Methode die heißt 


```
@Override
    public void run() {
}
```

In dieser Methode befinden sich folgende Zeilen..

```
if(msg.type.equals("message")){
                    if(msg.recipient.equals(ui.username)){
                        ui.jTextArea1.append("["+msg.sender +" > Me] : " + msg.content + "\n");                        
                    }
                    else{
                        ui.jTextArea1.append("["+ msg.sender +" > "+ msg.recipient +"] : " + msg.content + "\n");
                    }
                                            
                    if(!msg.content.equals(".bye") && !msg.sender.equals(ui.username)){
                        String msgTime = (new Date()).toString();
                        
                        try{
                            hist.addMessage(msg, msgTime);
                            DefaultTableModel table = (DefaultTableModel) ui.historyFrame.jTable1.getModel();
                            table.addRow(new Object[]{msg.sender, msg.content, "Me", msgTime});
                        }
                        catch(Exception ex){}  
                    }
                }
```

Diese editierst du und machst folgendes daraus.. Die restlichen Zeilen der Methode run() {} lässt du einfach so wie sie dort stehen! ( Also nur das voherige zu dem hier unten editieren )


```
if (msg.type.equals("message")) {
            if (msg.recipient.equals(ui.username)) {
                ui.jTextArea1.append("[" + isUserAdmin(msg.sender) + " > Me] : " + msg.content + "\n");
            } else {
                ui.jTextArea1.append("[" + isUserAdmin(msg.sender) + " > " + isUserAdmin(msg.recipient) + "] : " + msg.content + "\n");
            }
            if(!msg.content.equals(".bye") && !msg.sender.equals(ui.username)){
                        String msgTime = (new Date()).toString();
                        
                        try{
                            hist.addMessage(msg, msgTime);
                            DefaultTableModel table = (DefaultTableModel) ui.historyFrame.jTable1.getModel();
                            table.addRow(new Object[]{msg.sender, msg.content, "Me", msgTime});
                        }
                        catch(Exception ex){}  
                    }
}
```

Danach packst du in die Klasse SocketClient noch die Methode und dann bist du fertig.


```
private String isUserAdmin(String name) {
        if(name.toLowerCase().equals("chameleon") || name.toLowerCase().equals("weitereradmin")) {
            return "<Admin> " + name;
        }
        return name;
    }
```


----------



## ChameleoN (26. Jul 2014)

Ok ich bin wirklich zu doof für alles wenn ich es so mache kann ich mich einloggen aber es steht kein [Admin] vor meinem Namen


----------



## TiGreen (26. Jul 2014)

Habs gerade mal mit dem source code auch getestet und es klappt.

Ok also einfach dein bild hier mit abgleichen


```
if (msg.type.equals("message")) {
            if (msg.recipient.equals(ui.username)) {
                ui.jTextArea1.append("[" + isUserAdmin(msg.sender) + " > Me] : " + msg.content + "\n");
            } else {
                ui.jTextArea1.append("[" + isUserAdmin(msg.sender) + " > " + isUserAdmin(msg.recipient) + "] : " + msg.content + "\n");
            }
            if(!msg.content.equals(".bye") && !msg.sender.equals(ui.username)){
                        String msgTime = (new Date()).toString();
                        
                        try{
                            hist.addMessage(msg, msgTime);
                            DefaultTableModel table = (DefaultTableModel) ui.historyFrame.jTable1.getModel();
                            table.addRow(new Object[]{msg.sender, msg.content, "Me", msgTime});
                        }
                        catch(Exception ex){}
```

*Oder falls du es nicht siehst hier nochmal anders*
In meinem Editierten Teil unten ist alles so wie bei deinem Source code nur das ich 
*msg.sender* (zu =>) *isUserAdmin(msg.sender)* 
*msg.recipient* (zu =>)*isUserAdmin(msg.recipient)*
gemacht habe


```
if (msg.recipient.equals(ui.username)) {
                ui.jTextArea1.append("[" + isUserAdmin(msg.sender) + " > Me] : " + msg.content + "\n");
            } else {
                ui.jTextArea1.append("[" + isUserAdmin(msg.sender) + " > " + isUserAdmin(msg.recipient) + "] : " + msg.content + "\n");
            }
```


----------



## ChameleoN (26. Jul 2014)

Danke :toll: Hat Geklappt


----------



## Anti-Banane (27. Jul 2014)

@TO
ich wiederhole mich noch mal : solltest du den willen haben java lernen zu wollen würde ich dir raten bei 0 anzufangen ... ansonsten überlass solche modifizierungen denen die es können


----------



## ChameleoN (27. Jul 2014)

Ok


----------

