Server stellt sich hin

javamöger

Mitglied
Hallo an alle Javainteressierte,

habe ein einfaches Chat-Programm mit einem Server und beliebg vielen Clients erstellt. Nun habe ich auch dem Server ein GUI verpasst, welches startet aber erst auf Knopfdruck (JButton) den Server starten soll (das heißt nach Knopfdruck erst den Socketaufbau bewerkstelligt).
Leider stellt sich der Server (das GUI) hin, die Funktionalität ist jedoch unbeeinträchtigt. Der Quellcode kommt hier (braucht ihr den Client auch?):
Weiß jemand warum der Server hinsteht? Dank Euch im vorraus!


Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Iterator;


import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Server{
    
   /* JFrame serverFrame;
    JPanel serverPanel;
    JTextArea textArea_Info;
    JButton button_On;
    JButton button_Off;
    JScrollPane scrollPane_Info;*/
    
    static ServerSocket server;
    static ArrayList<PrintWriter> list_clientWriter;


    final int LEVEL_ERROR = 1;
    final int LEVEL_NORMAL = 0;
	private PrintWriter textArea_Info;


    public static void main(String[] args){
        System.setProperty("file.encoding", "UTF-8");
        Locale.setDefault(Locale.GERMAN);
        //System.out.println(Locale.getDefault());
        Server s = new Server();
        s.createGUI();
        /*if (s.runServer()) {
            s.listenToClients();
        } else {
            // Do nothing
        }*/
    }
    
    public void createGUI(){
        JFrame serverFrame = new JFrame("ServerGUI");
        serverFrame.setSize(800, 600);
        
        JPanel serverPanel = new JPanel();
        
        JTextArea textArea_Info = new JTextArea();
        textArea_Info.setEditable(false);
        textArea_Info.setSize(700, 500);
        textArea_Info.setLocation(40, 50);
        
        JButton button_On = new JButton("Server starten!");
        JButton button_Off = new JButton("Server stoppen!");
        
        button_On.addActionListener(new ServerOn());
        button_Off.addActionListener(new ServerOff());
        
        JScrollPane scrollPane_Info = new JScrollPane(textArea_Info);
        scrollPane_Info.setPreferredSize(new Dimension(700, 500));
        scrollPane_Info.setMinimumSize(new Dimension(700, 500));
        scrollPane_Info.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane_Info.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        
        serverPanel.add(scrollPane_Info);
        //serverPanel.add(textArea_Info);
        serverPanel.add(button_On);
        serverPanel.add(button_Off);
        
        
        serverFrame.getContentPane().add(BorderLayout.CENTER, serverPanel);
        serverFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        serverFrame.setVisible(true);
    }
    
    public class ServerOn implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            runServer();
           // if(runServer()){
                listenToClients();
          //  }else{
                
           // };
        }
    }
    
    public class ServerOff implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            //serverFrame.dispose(); //GUI weg
            stopServer();
        }
    }
    
    public boolean stopServer(){
        try {
            server.close();
            
           // aTM("Server Socket geschlossen");
            return true;
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
        
    }
    
   /* public void aTM(String message) {
        textArea_Info.append(message + "\n");
    }*/
    
    public class ClientHandler implements Runnable {


        Socket client;
        BufferedReader reader;


        public ClientHandler(Socket client) {
            try {
                this.client = client;
                reader = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


        @Override
        public void run() {
            String nachricht;


            try {
                while ((nachricht = reader.readLine()) != null) {
                    appendTextToConsole("Vom Client: \n" + nachricht, LEVEL_NORMAL);
                    sendToAllClients(nachricht);
                }
            } catch (SocketException s) {
                //s.printStackTrace();
                //System.out.println(this.client +"\n" +"Hat Verbindung getrennt!" +"\n");
                //aTM(this.client +"\n" +"Hat Verbindung getrennt!" +"\n");
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    public void listenToClients() {
        while (true) {
            try {
                Socket client = server.accept();


                PrintWriter writer = new PrintWriter(client.getOutputStream());
                list_clientWriter.add(writer);


                Thread clientThread = new Thread(new ClientHandler(client));
                clientThread.start();
                System.out.println(client +"\n" +"Hat sich Verbunden!" +"\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    public boolean runServer() {
        try {
            server = new ServerSocket(50000);
            appendTextToConsole("Server wurde gestartet!", LEVEL_ERROR);
            //aTM("Server wurde gestartet!");


            list_clientWriter = new ArrayList<PrintWriter>();
            return true;
        } catch (IOException e) {
            appendTextToConsole("Server konnte nicht gestartet werden!", LEVEL_ERROR);
            //aTM("Server konnte nicht gestartet werden!");
            e.printStackTrace();
            return false;
        }
    }


    public void appendTextToConsole(String message, int level) {
        if (level == LEVEL_ERROR) {
            System.err.println(message + "\n");
        } else {
            System.out.println(message + "\n");
        }
    }


    public void sendToAllClients(String message) {
        Iterator<PrintWriter> it = list_clientWriter.iterator();


        while (it.hasNext()) {
            PrintWriter writer = (PrintWriter) it.next();
            //writer.format(Locale.GERMANY, "UTF-8", null);
            writer.println(message);
            writer.flush();
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Moin,

>> Weiß jemand warum der Server hinsteht?
Was bitte bedeutet das denn :bahnhof:

Quelltext ist bitte in
Java:
-Tags schreiben !![/B]
So bekommt man ja Augenkrebs :bae:

Gruß Klaus
 
Weiß jemand warum der Server hinsteht?
Meinst du vielleicht das die GUI nicht mehr reagiert?
Das liegt daran, dass du innerhalb des GUI-Threads deine clients akzeptierst (server.accept).
Diese Methode blockiert halt, bis ein client verbunden wird. Daher solltest du die ganze listenToClients()-Methode in einem eigenen Thread durchführen
 
Moin,

>> Weiß jemand warum der Server hinsteht?
Was bitte bedeutet das denn :bahnhof:

Quelltext ist bitte in
Java:
-Tags schreiben !![/B]
So bekommt man ja Augenkrebs :bae:

Gruß Klaus[/QUOTE]

Hallo VFL_Freak,

sry wg. der Form, das sieht tatsächlich übel aus! Hab wohl husch-husch mit Copy-Paste gearbeitet, abgeschickt und oben ist das Erg zu sehen.
 
Meinst du vielleicht das die GUI nicht mehr reagiert?
Das liegt daran, dass du innerhalb des GUI-Threads deine clients akzeptierst (server.accept).
Diese Methode blockiert halt, bis ein client verbunden wird. Daher solltest du die ganze listenToClients()-Methode in einem eigenen Thread durchführen

Hallo InfectedBytes,

"Meinst du vielleicht das die GUI nicht mehr reagiert?"

Genau das meinte ich! Werd mich wieder darüber her machen. Dank Dir vielmals!! Ich hoffe, mich in dieser Sache nicht mehr melden zu müssen 🙂
Beste Grüße
 
Hab jetzt viel dran rumgebastelt, aber komme auf keine Lösung. Sobald ich die listenToClients() auskommentiere ist das GUI nicht mehr eingefroren - aber mein Server "taub" (was InfectedBytes sagt). Hab auch versucht die listenToClients im eigenen Thread auszuführen, nur klappts nicht. Wie rufe ich einen neuen (eigenen) Thread (für die listenToClients() ) mit einem Button auf (also mit ServerOn)?
@
InfectedBytes: Mein GUI läuft in einem Thread? Wie sollte ich das ganze programmieren? Mir kommt vor, als wäre es nicht möglich einen Server (die Socket) per Knopfdruck starten und anhalten zu können.

Lieben Gruß, freue mich über Hilfe

 
hier der grobe Code für den ListenThread
Java:
public class ListenThread extends Thread {
	private ServerSocket socket;
	public void stopListening() {
		socket.close(); // => socket.accept wirft ne exception, durch welche du die schleife verlässt
	}
	public void run() {
		while(true) {
			try {
				Socket client = socket.accept(); //wirft ne exception, wenn socket.close() aufgerufen wird.
				//...
			} catch(IOException e) {
				return; //wichtig! schleife muss verlassen werden!
			}
		}
	}
}

in deinem ActionListener des ServerOn buttons startest du dann einfach den thread:
Java:
listenThread = new ListenThread();
listenThread.start();

und im ActionListener des ServerOff Buttons rufst du einfach die stopListening Methode auf:
Java:
listenThread.stopListening();
 
Hallo InfectedBytes,

das sieht gut aus, kein eingefrorenes GUI mehr. Vielen Dank!!. Nur hab ich jetzt folgende Fehlermeldung:

Server wurde gestartet!


Exception in thread "Thread-2" java.lang.NullPointerException
at Server$ListenThread.run(Server.java:247)

-> 247 ist unten in der public void run() der Threadklasse die Zeile: Socket client = server.accept();
-> Außerdem scheint der Server wieder "taub", Nachrichten der Clients werden nicht weitergeleitet.

Der ganze Code kommt hier (ich hoff ich mach das jetzt richtig):

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Iterator;


import javax.swing.*;


import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Server{
    
    static ServerSocket server;
    static ArrayList<PrintWriter> list_clientWriter;


    final int LEVEL_ERROR = 1;
    final int LEVEL_NORMAL = 0;
	public static void main(String[] args){
        System.setProperty("file.encoding", "UTF-8");
        Locale.setDefault(Locale.GERMAN);
        //System.out.println(Locale.getDefault());
        Server s = new Server();
        s.createGUI();
        
        /*if (s.runServer()) {
            s.listenToClients();
        } else {
            // Do nothing
        }*/
            
    }
    
    
    /*public void listenToClients() {
        while (true) {
            try {
                Socket client = server.accept();


                PrintWriter writer = new PrintWriter(client.getOutputStream());
                list_clientWriter.add(writer);


                Thread clientThread = new Thread(new ClientHandler(client));
                clientThread.start();
                System.out.println(client +"\n" +"Hat sich Verbunden!" +"\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }*/
    
    public void createGUI(){
        JFrame serverFrame = new JFrame("ServerGUI");
        serverFrame.setSize(700, 500);
        
        JPanel serverPanel = new JPanel();
        
        JTextArea textArea_Info = new JTextArea();
        textArea_Info.setEditable(false);
        textArea_Info.setSize(600, 400);
        textArea_Info.setLocation(40, 50);
        
        JButton button_On = new JButton("Server starten!");
        JButton button_Off = new JButton("Server stoppen!");
        
        button_On.addActionListener(new ServerOn());
        button_Off.addActionListener(new ServerOff());
        
        JScrollPane scrollPane_Info = new JScrollPane(textArea_Info);
        scrollPane_Info.setPreferredSize(new Dimension(600, 400));
        scrollPane_Info.setMinimumSize(new Dimension(600, 400));
        scrollPane_Info.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane_Info.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        
        serverPanel.add(scrollPane_Info);
        //serverPanel.add(textArea_Info);
        serverPanel.add(button_On);
        serverPanel.add(button_Off);
        
        
        serverFrame.getContentPane().add(BorderLayout.CENTER, serverPanel);
        serverFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        serverFrame.setVisible(true);
    }
    
   
    
    public class ServerOn implements ActionListener{
      //  @Override
    	
        public void actionPerformed(ActionEvent e) {
        	
        	runServer();
        	ListenThread listenThread = new ListenThread();
        	listenThread.start();
           
            }              
   }
        
    public boolean runServer() {
        try {
            server = new ServerSocket(50000);
            appendTextToConsole("Server wurde gestartet!", LEVEL_ERROR);
            //aTM("Server wurde gestartet!");
            //listenToClients();
            list_clientWriter = new ArrayList<PrintWriter>();
            return true;
        } catch (IOException e) {
            appendTextToConsole("Server konnte nicht gestartet werden!", LEVEL_ERROR);
            //aTM("Server konnte nicht gestartet werden!");
            e.printStackTrace();
            return false;
        }
    }  
   
    
    public class ServerOff implements ActionListener{
       // @Override
        public void actionPerformed(ActionEvent e) {
            //serverFrame.dispose(); //GUI weg
        	ListenThread listenThread = new ListenThread();
        	listenThread.stopListening();
        	//stopServer();
        }
    }
    
    	/*public boolean stopServer(){
    		try {
            server.close();
    			
           // aTM("Server Socket geschlossen");
            return true;
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            return false; 
        }
    		
    }*/
    
    /*public void aTM(String message) {
        textArea_Info.append(message + "\n");
    }*/
    
    public class ClientHandler implements Runnable {


        Socket client;
        BufferedReader reader;


        public ClientHandler(Socket client) {
            try {
                this.client = client;
                reader = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


        @Override
        public void run() {
            String nachricht;


            try {
                while ((nachricht = reader.readLine()) != null) {
                    appendTextToConsole("Vom Client: \n" + nachricht, LEVEL_NORMAL);
                    sendToAllClients(nachricht);
                    
                }
            } catch (SocketException s) {
                //s.printStackTrace();
                //System.out.println(this.client +"\n" +"Hat Verbindung getrennt!" +"\n");
                //aTM(this.client +"\n" +"Hat Verbindung getrennt!" +"\n");
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    


    /*public void listenToClients() {
        while (true) {
            try {
                Socket client = server.accept();


                PrintWriter writer = new PrintWriter(client.getOutputStream());
                list_clientWriter.add(writer);


                Thread clientThread = new Thread(new ClientHandler(client));
                clientThread.start();
                System.out.println(client +"\n" +"Hat sich Verbunden!" +"\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }*/


   


    public void appendTextToConsole(String message, int level) {
        if (level == LEVEL_ERROR) {
            System.err.println(message + "\n");
        } else {
            System.out.println(message + "\n");
        }
    }


    public void sendToAllClients(String message) {
        Iterator<PrintWriter> it = list_clientWriter.iterator();


        while (it.hasNext()) {
            PrintWriter writer = (PrintWriter) it.next();
            //writer.format(Locale.GERMANY, "UTF-8", null);
            writer.println(message);
            writer.flush();
        }
    }	


    public class ListenThread extends Thread{
    	
    	private ServerSocket server;
    	
    	public void stopListening() {
    		try {
				server.close();		// server.accept wirft ne exception, durch welche Schleife verlassen wird
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				} 			 
    						
    	}
    	
    	public void run(){
			
    		while(true){
    			try {
    				
    				Socket client = server.accept();	//server.accept();
    				
    				PrintWriter writer = new PrintWriter(client.getOutputStream());
                    list_clientWriter.add(writer);


                    Thread clientThread = new Thread(new ClientHandler(client));
                    clientThread.start();
                    System.out.println(client +"\n" +"Hat sich Verbunden!" +"\n");
    			
    			} catch (IOException e) {
    				 e.printStackTrace();
					return; //wichtig! schleife muss verlassen werden!
					
				}
    			}
				
    			
			}
    		
    }
    
}
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben