Java Chat Duplicate names

Status
Niet open voor verdere reacties.

ferentuske

Gebruiker
Lid geworden
5 okt 2013
Berichten
78
Hey

Als ik mijn Server start moet de gebruiker een naam kiezen.
Als er al een gebruiker met dezelfde naam aanwezig is moet je een melding krijgen dat deze naam al in gebruik is.
maar ik weet niet hoe ik dit moet doen ?


Dus in mijn server heb ik een lijst van connectiethreads dus voor elke gebruiker die conecteerd word er een nieuwe connectiethread aan de arraylist toegevoegd.
en in mijn thread gebruik een een switch om de verschillende commands van elkaar te scheiden.
Dus ik dacht om een controle in die switch van CONNECT te stoppen. heb al vanalles geprobeerd en het werd zo complex dat het helemaal niet meer werkte dus heb het dan ook maar verwijderd.
Ik denk dat er gemakkelijkere manieren bestaan maar vind hem spijtig genoeg niet.

Iemand enig idee ?


Connectie klasse
Code:
public class ConnectionThread extends Thread {

    private Socket socket;
    private Server server;
    private BufferedReader in;
    private PrintWriter out;
    public String username = null;

    public ConnectionThread(Socket socket,Server server) throws IOException {
        this.socket = socket;
        this.server = server;
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(socket.getOutputStream(),true);
    }



    @Override
    public void run() {
        String line = "";
        try {


            while (((line = in.readLine()) != null))
            {
                System.out.println("Client said " + line);
                String split[] = line.split("\\|");

                String command = split[0];



                    switch (command) {
                        case "CONNECT": {
                            username = split[1];
                            server.broadCastMessage(username + " has connected");
                            break;
                        }
                        case "CHAT": {
                            server.broadCastMessage(username + ": " + split[1]);

                            break;
                        }
                        case "POGING": {
                            server.raden(Integer.parseInt(split[1]), username);
                            break;
                        }
                        case "toon": {
                            System.out.println(server.getRandomNumber());
                            break;
                        }

                    }

            }


        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void sendMessage(String line) 
    {
        out.println(line);
    }







}



Server klasse
Code:
public class Server {

    private ServerSocket serverSocket;
    private Socket socket;
    public List<ConnectionThread> connections;
    private int randomNumber = 5;


    public Server() throws IOException {
        setRandomNumber();
        serverSocket = new ServerSocket(6000);
        connections = new ArrayList<>();
        addConnection();

    }

    private void addConnection() throws IOException {
        while(true)
        {
            socket = serverSocket.accept();
            System.out.println("Client connected");
            ConnectionThread clientConnect = new ConnectionThread(socket,this);
            connections.add(clientConnect);
            clientConnect.start();

        }
    }



    public void setRandomNumber()
    {
        Random r = new Random();

       randomNumber = r.nextInt(10);
    }

    public int getRandomNumber()
    {
        return randomNumber;
    }


    public void raden(int poging,String username)
    {
        if(poging == randomNumber)
        {
            broadCastMessage(username + " has the correct answer");
            setRandomNumber();
        }
    }


    public static void main(String[] args) throws IOException {
        new Server();
    }

    public void broadCastMessage(String line) {
        for (ConnectionThread connection : connections)
        {
         connection.sendMessage(line);
        }
    }



}
 
server zal singleton en runneble

client zal dat niet zijn

Code:
new Thread(
 1     new Runnable(){
 2       public void run(){
 3         class1.putDataOnOutputStream(out);
 4       }
 5     }
 6   ).start();

maar ik denk dat je best ook kijkt naar threadpool zodat u kan controleren wie er in zit (in server en kan ook collectie zijn)
 
de Server werkt perfect dit is het probleem niet. Het is gewoon ik wil een controle in mijn switch van CONNECT dus als er een gebruiker alreeds in de chat zit met die naam moet je een melding krijgen dat die naam al in gebruik is.
Het is hier dat ik vast zit atm.
 
Zelf zou ik de " Connection" klasse niet direct een thread maken, maar gewoon een object binnen de server. Oftwel een gebruiker object. De server kan best een soort parser bevatten voor het protocol dat de server afspreekt met z'n client connecties. Je kan dan de parser aanroepen in een switch en de juiste functionaliteit aan het juiste command koppelen. Bijvoorbeeld bij de command: newUsername roep je checkUsernames en daarna user.setUsername aan. Of je geeft een melding via je outstream dat de username bezet is.

Zoiets wellicht:
Code:
List<Users> users;
Parser parser = new CustomParser(new CustomProtocol()));

// server loop
while(true) {
     Command command = parser.parse(in.read...); 
     switch(command.newPlayer) {
           if(checkUsernameExists(command.value)){ 
                    out.write(" username exists" );
           } else {
                  users.add(new User(command.value));
                  out.write("joined");
          }
      } 

}
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan