Socket Fehler bei Streams

  • Themenstarter Themenstarter Niki564
  • Beginndatum Beginndatum
N

Niki564

Gast
Hey Leute, wir müssen für die Schule irgendein Javaprojekt machen. Ich habe mich für ein Netzwerkfähiges Pokerspiel entschieden.
Zuerst wählt man aus ob man eine Lobby erstellen oder einer beitreten möchte. Beim erstellen gibt man noch den Servername ein und dann wartet man mit serverSocket.accept() auf ein Verbindung. Beim beitreten muss man nur den Spielername und IP des Servers eingeben. Danach wird eine Verbindung mit dem Server hergestellt und man sendet ihm zuerst den Spielername. Danach werden Infos in einem bestimmten Format vom Server zurückgegeben. Danach wird im Server der Socket zum Client in einer Liste gespeichert.
Hier der Code für den Server:
Java:
        Thread connect = new Thread()
        {
            @Override
            public void run()
            {
                while(true)
                {
                    try
                    {
                        joiner = connecter.accept();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(joiner.
                            getInputStream()));
                        PrintWriter writer = new PrintWriter(joiner.
                            getOutputStream());
                        String gName = reader.readLine();
                        for(Socket s : clients)
                        {
                            PrintWriter out = new PrintWriter(s.getOutputStream());
                            System.out.println("Lobby: println");
                            out.println(gName);
                            System.out.println("Lobby: println done");
                        }
                        clients.add(joiner);
                        opss.add(writer);
                        addGamerName(gName);                                                     //Fügt den Spieler in die JList hinein
                        writer.println(lob.toString());
                        writer.flush();
                    } catch(IOException ex)
                    {
                        Logger.getLogger(Lobby.class.getName()).
                            log(Level.SEVERE, null, ex);
                    }
                }
            }
        };
        connect.start();

Hier der Code beim beitreten der Loby
Java:
String name = txtName.getText(), lobbyIP = txtLobbyIP.
                        getText();
                    if(name.equals("") || lobbyIP.equals(""))
                    {
                        JOptionPane.showMessageDialog(pf, "Alle Felder müssen ausgefüllt werden");
                        return;
                    }
                    String info = null;
                    try
                    {
                        socket = new Socket(txtLobbyIP.getText(), PokerFrame.PORT);
                        ops = socket.getOutputStream();
                        PrintWriter writer = new PrintWriter(ops);
                        ips = socket.getInputStream();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(ips));
                        writer.println(txtName.getText());
                        writer.flush();
                        info = reader.readLine();
                    } catch(UnknownHostException ex)
                    {
                        Logger.getLogger(LobbyJoiner.class.getName()).
                            log(Level.SEVERE, null, ex);
                    } catch(IOException ex)
                    {
                        Logger.getLogger(LobbyJoiner.class.getName()).
                            log(Level.SEVERE, null, ex);
                    }
                    String[] infos = info.split(";");
                    LobbyPane lobby = new LobbyPane(infos[0], Integer.parseInt(infos[1]), infos[2], infos[3].
                        split("/"));
                    pf.setContentPane(lobby);

Und noch die ClientLobby wenn sich jemand zum Server connected, dass der Server allen anderen Clients den neuen Spieler ebenfalls sendet

Java:
Thread t = new Thread(new Runnable()
            {
                public void run()
                {
                    while(true)
                    {
                        try
                        {
                            System.out.println("Client: create reader");
                            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); /*beim Lobby erstellen wird der Socket zum Server mitgegeben, dies ist der <socket>*/
                            String cmd = in.readLine();
                            System.out.println("Client: readLine done");
                            listModel.addElement(cmd);
                            gamerName.add(cmd);
                        } catch(IOException ex)
                        {
                            Logger.getLogger(PokerFrame.class.getName()).
                                log(Level.SEVERE, null, ex);
                        }
                    }
                }
            });
            t.start();
Der Fehler ist jetzt, dass die bereits erstellte Clientlobby keine Infos mehr vom Server bekommt, obwohl der Server an allen Clients den neuen Spielernamen schickt. Ich haba keine Ahnung warum das so ist, und hoffe jemand kann mir weiterhelfen!

lg Niki
 
Ganz schon ambitioniert ein netzwerkfähiges Pokerspiel als Schulprojekt zu programmieren.

Ich nehme mal an die Kommunikation via Socket wurde in der Schule behandelt!?

Warum wird denn im dritten Codeausschnitt der Reader jedesmal neu erstellt, nachdem eine Zeile eingelesen wurde? Ausserdem existiert ja noch der Reader auf den InputStream aus Codeabschnitt 2 oder woher kommt das socket in Code 3?
 
Nein leider haben wir dies noch nicht im unterricht durchgenommen

Zur Frage mit den Sockets: Ich habe es ein wenig kompliziert programmiert. Ich habe in meiner Hauptklasse innere Klassen von z.B. Lobby oder LobbyJoiner und dabei die Events in der Hauptklasse. Und in meiner Hauptklasse befindet sich das Socket Objekt
 

Neue Themen


Zurück
Oben