# bei dem Connect: IOException



## OVERGAME (6. Apr 2011)

Meine Chat Applikation lief gestern noch wunderbar , heute nicht mehr !!
Der ChatServer hat sich dafür entschieden heute nicht verbinden zu lassen?
soll ich auf Morgen warten und gucken vielleicht denkt er sich das anders 
oder ist hier jemand mit dem Problem vertraut ?
bitte um hilfe
mfg


----------



## Gast2 (6. Apr 2011)

Poste doch einfach mal die Exception und den relevanten Code teil.


----------



## OVERGAME (6. Apr 2011)

gerne bei dem Code bin ich mir nicht sicher dass du es dir angucken willst , ist ziemlich lang!!
ausserdem hab ich da nix geändert!
	
	
	
	





```
*** java.net.ConnectException: Connection refused: connect
```
ChatServer Code :

```
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Iterator;
import java.util.LinkedList;

public class ChatServer implements Runnable{
	
	private ServerSocket serverSocket;
	private static int port=3000 ;
	private Socket clientSocket;
	 protected LinkedList threadList = new LinkedList();
	private Iterator iterator;
	
	
	public static void main(String args[]){
		if(args.length==1){
			try{ 
				port=Integer.parseInt(args[0]);
			}catch(NumberFormatException nfe){
				System.out.println("ungültige Port Eingabe");
				}
			}
		ChatServer server = new ChatServer();
		server.init();
		server.closeAll();
	}

private void init(){
	    try{
		serverSocket = new ServerSocket(port);
		System.out.println("Server horscht an port "+port);
	
       }catch(IOException ioe){
	   System.out.println(ioe.toString());
       }try{
	    clientSocket=serverSocket.accept();
	    System.out.println("Verbindung zu Socket" +clientSocket.getRemoteSocketAddress()+" aufgenommen");
	    //IN DIESEM BEREICH 
	    //WIRD CLIENTTHREAD ERZEUGT UNd THREAD und wird gestartet
	    ClientThread clientThread= new ClientThread(clientSocket ,this);
	    Thread thread = new Thread(clientThread.getThreadName());
	    threadList.add(clientThread);
	    thread.start();
	    
	    
       }catch (IOException ioe) {
	   System.out.println(ioe.toString());
     }

}
      private void closeAll() {
	//die Streams  in den ClientThreadObjekten 
      try{
	   serverSocket.close();
	     }catch(IOException ioe){
	    	 System.out.println(ioe.toString());
	   	   }
		}
      
      public  void generateOutput (String output) {
          iterator = threadList.iterator();
          while (iterator.hasNext()) {
              ClientThread thread = (ClientThread) iterator.next();
              thread.output(output);
          }
      }
  	public void run() {
  		// TODO Auto-generated method stub
  		
  	}
  }
```


----------



## Gast2 (6. Apr 2011)

Das ist nur die erste Zeile der Exception.
Ersetz mal 

```
System.out.println(ioe.toString());
```
durch

```
ioe.printStacktrace();
```
Dann solltest du nen bissl mehr sehen.


----------



## OVERGAME (6. Apr 2011)

vorher hatte das auch mit toString geklappt !!
jedenfalls jetzt nach dieser änderung funktioniert das wieder ,dafür vielen dank.
kannst du mir bitte wo wir schon mal dabei sind ,einen Hinweis geben wie die Nachricht 
von einem Clienten nicht für alle andere Clienten sichtbar wird ?
Benutzer oberfläche sieht so aus 
	
	
	
	





```
package chat;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.io.*;
 

public class ChatClientFrame extends JFrame implements ActionListener {
 
 
	private static final long serialVersionUID = 1L;
	private JTextField jtfEingabe;
    private JLabel label;
    private JButton button;
    private JEditorPane editorPane;
    private Container contentPane;
    private String labelText = "";
    private JMenuBar menuBar;
    private JMenu menuOperation, menuHelp;
    private JMenuItem opClose, opConnect, opDisconnect, hlpHelp, hlpAbout;
    private Action actClose, actConnect, actDisconnect, actHelp, actAbout;
    private KeyStroke stroke;
    private JToolBar toolBar;
    private JButton jbClose, jbConnect, jbDisconnect, jbHelp, jbAbout;
    private final String TTT_SCHL = "Schließt ";
    private final String TTT_VERB = "Verbindet ";
    private final String TTT_ABBR = "Verbindung-Abbruch ";
    private final String TTT_HLP = "Help";
    private final String TTT_ABT = "About";
    private BufferedReader serverIn;
    private PrintWriter serverOut;
    private String host, user="";
    private ClientInputThread inputThread;
    private Socket clientSocket;
    private int port=4444;
    private InetAddress inetadr;
 
 
 
 
    public ChatClientFrame (){
        super ("Chat-Client von ");
        setSize (400, 200);
        contentPane=this.getContentPane();
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
 
 
        //Eingabefeld einbauen
        jtfEingabe = new JTextField ("");
        jtfEingabe.setBackground (Color.white);
        jtfEingabe.setForeground (Color.blue);
        
        jtfEingabe.addKeyListener (new KeyAdapter (){
            public void keyPressed (KeyEvent ke) {
                // bei Enter Text übermitteln
                if (ke.getKeyCode ()==KeyEvent.VK_ENTER) {
                    String text = jtfEingabe.getText().trim();
                    if (text.length() > 0){
                        if (serverOut  != null){
                            serverOut.println(text);
                            //Eingabefeld wieder löschen
                            jtfEingabe.setText ("");
                        }
                        else {
                            jtfEingabe.setText (
                          "zunächst Verbindung zu einem server herastellen!");
                        }
                    }
                    else {jtfEingabe.setText ("Bitte Text eingeben!");
                }
            }
        }
        });
        
 
        editorPane = new JEditorPane();
        JScrollPane editorScroll = new JScrollPane (editorPane);
        editorPane.setContentType("text/html");
        
        this.createMenu();
        this.createToolBar ();
        
        JPanel panel = new JPanel ();
        panel.setLayout (new BorderLayout());
        contentPane.add (BorderLayout.CENTER, panel);
        contentPane.add (BorderLayout.NORTH, toolBar);
        panel.add (BorderLayout.CENTER, editorScroll);
        panel.add (BorderLayout.SOUTH, jtfEingabe);
 
        setVisible (true);
        
        
 
    }
 
 
    public void createMenu () {
        menuBar = new JMenuBar();
        this.setJMenuBar (menuBar);
        menuOperation = new JMenu ("Operationen");
        menuOperation.setMnemonic ('o');
        menuHelp= new JMenu ("Hilfe");
        menuHelp.setMnemonic ('h');
 
        menuBar.add (menuOperation);
        menuBar.add (menuHelp);
 
        actClose = new AbstractAction ("Schließen", new ImageIcon ("images/Stop16.gif")) {
            public void actionPerformed (ActionEvent ae) {
                if (clientSocket != null){ 
                        disconnectServer ();
                }
                System.exit (0);
                System.out.println ("Close wurde gedrückt");
            }
        };
        // Key-Stroke-Objekt (Shortcut) definieren
        stroke = KeyStroke.getKeyStroke (KeyEvent.VK_S, InputEvent.CTRL_MASK);
 
        // Shortcut im Action-Objekt speichern
        actClose.putValue (Action.ACCELERATOR_KEY, stroke);
 
        actClose.putValue (Action.SHORT_DESCRIPTION, TTT_SCHL);
        opClose = menuOperation.add (actClose);
        opClose.setMnemonic ('s');
 
        actConnect = new AbstractAction ("Verbinden", new ImageIcon ("images/Export16.gif")) {
            public void actionPerformed (ActionEvent ae) {
                connectServer();
            }
        };
        // Key-Stroke-Objekt (Shortcut) definieren
        stroke = KeyStroke.getKeyStroke (KeyEvent.VK_V, InputEvent.CTRL_MASK);
 
        // Shortcut im Action-Objekt speichern
        actConnect.putValue (Action.ACCELERATOR_KEY, stroke);
 
        actConnect.putValue (Action.SHORT_DESCRIPTION, TTT_VERB);
        opConnect = menuOperation.add (actConnect);
        opConnect.setMnemonic ('v');
 
        actDisconnect = new AbstractAction ("Verb. Abbrechen", new ImageIcon ("images/Import16.gif")) {
                public void actionPerformed (ActionEvent ae) {
                    disconnectServer();
                    System.out.println ("Disconnect wurde gedrückt");
                }
        };
        // Key-Stroke-Objekt (Shortcut) definieren
        stroke = KeyStroke.getKeyStroke (KeyEvent.VK_A, InputEvent.CTRL_MASK);
 
        // Shortcut im Action-Objekt speichern
        actDisconnect.putValue (Action.ACCELERATOR_KEY, stroke);
 
        actDisconnect.putValue (Action.SHORT_DESCRIPTION, TTT_ABBR);
        opDisconnect = menuOperation.add (actDisconnect);
        opDisconnect.setMnemonic ('a');
 
        actHelp = new AbstractAction ("Hilfe", new ImageIcon ("images/Help16.gif")) {
            public void actionPerformed (ActionEvent ae) {
                }
        };
        // Key-Stroke-Objekt (Shortcut) definieren
        stroke = KeyStroke.getKeyStroke (KeyEvent.VK_H, InputEvent.CTRL_MASK);
 
        // Shortcut im Action-Objekt speichern
        actHelp.putValue (Action.ACCELERATOR_KEY, stroke);
 
        actHelp.putValue (Action.SHORT_DESCRIPTION, TTT_HLP);
        hlpHelp = menuHelp.add (actHelp);
        hlpHelp.setMnemonic ('h');
 
        actAbout = new AbstractAction ("About", new ImageIcon ("images/About16.gif")) {
            public void actionPerformed (ActionEvent ae) {
                }
        };
        // Key-Stroke-Objekt (Shortcut) definieren
        stroke = KeyStroke.getKeyStroke (KeyEvent.VK_B, InputEvent.CTRL_MASK);
 
        // Shortcut im Action-Objekt speichern
        actAbout.putValue (Action.ACCELERATOR_KEY, stroke);
 
        actAbout.putValue (Action.SHORT_DESCRIPTION, TTT_HLP);
        hlpAbout = menuHelp.add (actAbout);
        hlpAbout.setMnemonic ('h');
    }
 
    private void createToolBar () {
        
        toolBar = new JToolBar ();
        jbClose = toolBar.add(actClose);
        jbConnect  = toolBar.add(actConnect);
        jbDisconnect = toolBar.add(actDisconnect);
        toolBar.addSeparator ();
        jbHelp = toolBar.add(actHelp);
        jbAbout = toolBar.add(actAbout);
    }
    
    private void connectServer () {
        try {
            
            host = InetAddress.getLocalHost().getHostName();
            clientSocket = new Socket (host, port);
            serverIn = new BufferedReader (new InputStreamReader (
                    clientSocket.getInputStream()));
            serverOut = new PrintWriter (
                    clientSocket.getOutputStream (), true);
            // BenutzerName an Server
            serverOut.println (user);
            inputThread = new ClientInputThread (editorPane, serverIn);
            inputThread.start ();
            jtfEingabe.setText ("");
        }
        catch (UnknownHostException uhe) {
            System.out.println ("bei dem Connect: UnknownHostException");
            System.out.println ("*** "+ uhe.toString());
            System.exit(-1);
        }
        catch (IOException ioe) {
            System.out.println ("bei dem Connect: IOException");
            System.out.println ("*** "+ ioe.toString());
            System.exit(-1);
        }
    }
 
    private void disconnectServer(){
        serverOut.println ("exit");
        inputThread = null;
        try {
            serverIn.close();
            serverOut.close();
            clientSocket.close();
            
            
        }
        catch (IOException ioe) {
            System.out.println ("*** "+ioe.toString());
        }
    }
 
    public static void main(String [] args) {
        new ChatClientFrame();
    }
 
    public void actionPerformed (ActionEvent ae) {
 
    }
    
}
```

und zwar wenn ich das zb 3 mal starte dann habe ich 3 clienten ,die die Nachrichten von einander
sehen können.
ich brauche einen Hinweis wie ich das so einrichte dass zb nur client 2 die nachricht sieht aber nicht 
client 3.


----------



## SlaterB (6. Apr 2011)

bei mir funktioniert eine Verbindung mit einigen Umstellungen, ClientThread usw. fehlen, für die initiale Verbindung aber egal,
die Default-Ports sind unterschiedlich, 3000 im Server, 4444 im Client, hast du das bedacht?

der Server ist auch bisschen knapp, mehr als einmal accept() wird nicht ausgeführt, wie soll der drei Verbindungen hinbekommen?

> ich brauche einen Hinweis wie ich das so einrichte dass zb nur client 2 die nachricht sieht aber nicht client 3. 

funktionieren denn jetzt die Verbindungen schon wieder?
das ist ja ein komplett anderes logisches Problem, zu Nachrichten und Verteilung hast du keinen Code bisher gepostet,
da muss du eben entsprechend aufwendig strukturieren, z.B. im Server zu jeder Nachricht die Quelle speichern und beim Weitersenden dann darauf achten dass es nicht an die Quelle zurückgeht oder was auch immer


----------



## OVERGAME (6. Apr 2011)

um genau zu sein, handelt es sich um eine Aufgabe ,und ich hab einen verständnis Problem :

Clients schicken Nachrichten an den Server.
Server verteilt diese Nachrichten an alle angeschlossene Clients.
Diese Verteilung soll Thread-Safe verlaufen ,sodass sich Nachrichten diverser Clients nicht gegenseitig stören.

für mich ist das komische fragenstellung, wenn ich richtig verstehe !! soll sich eine Nachricht nicht bei allen gezeigt werden
sondern nur bei dem Client an dem die Nachricht adressiert wird ?

denke ich richtig ? oder denke zu komplex ?


----------



## SlaterB (6. Apr 2011)

ich sehe da die Frage nicht eindeutig und wie man das umsetzt ist dann nochmal ne andere Frage,
sicherlich sollte ein Client seine eigenen Nachrichten nicht so wie fremde anzeigen, sie aber zu erhalten kann auch gut sein als Kontrolle, dass der Server sie erhalten hat..


----------



## OVERGAME (7. Apr 2011)

Ich danke dir für dein Support man !
ich konnte bisher alle Probleme beseitigen und antworten endlich liefern .
jetzt mal zu nächsten und letzten Aufgabe : Der Server soll beim anmelden eines Clienten 
mitteilen wer alles bereit im chat teilnimmt .

wie soll ich da vorgehen ?


----------



## SlaterB (7. Apr 2011)

na korrekt auf dem ganz offensichtlichen normalen Wege?
der Client baut die Verbindung zum Server auf, dieser initalisiert bei sich alles nötige zum Client
und sendet dann nicht gerade zufällig auch erste Daten (dass Client und Server kommunizieren ist ja wohl nicht ungewöhnlich),
unter diesen Daten sind dann eben auch Informationen über andere aktive Clients, 
darüber wird der Server ja wohl Beschweid wissen und dies in verarbeitbare Informationen verbauen können,

wie Daten übertragen werden ist eine andere Frage, bei Sockets sicher nur Strings? 
überlege dir ein Protokoll, je nach bestimmten Schlüsselwort am Anfang wird eine Nachricht oder sonstige Information geschickt,
XML wenn es komplizierter wird,

eine weitere Frage ist, ob alle anderen Clients über den so eben neu angemelteten informiert werden


----------



## OVERGAME (7. Apr 2011)

so als Anfänger fällt mir nichts anders ausser ein String variable zu deklarieren die entwerder den Wert "Niemand" hat wenn niemand Bereit im chat ist oder halt "liste der Bereit angemeldete Clients" wenn 
sich vorher leute angemeldet haben eben !!
das habe ich in meinem  
	
	
	
	





```
void connectServer(){ serverOut.println(+meineVar); }
```
 wobei    


```
serverOut = new PrintWriter ( clientSocket.getOutputStream (), true);
```
 ist .

kann ich in der Richtung weitermachen ?
wenn ja ..wie soll mein String variable wissen wer alles bereit da ist ?

mfg


----------



## SlaterB (7. Apr 2011)

tja, das hat dann nichts mit der Kommunikation zu einem Client zu tun sondern du solltest dann erstmal im Server selber etwas Leben einbauen,
ich kann dir dein Programm nicht schreiben, du hast selber anscheinend wenig Ahnung, da ist das schwer

aber du hast doch eine Liste einer Clients, "protected LinkedList threadList"?

```
System.out.println("ich bin der Server, irgendwo führe ich gerade Code aus und überlege mir jetzt was");
String info = "";
for( alle Clients c in der Liste) {
  info += "einer der Clients ist: "+ ... c ... ;
}
System.out.println("nun habe ich geschafft, alle Clients in einem String zu beschreiben: "+info);

for( alle Clients c in der Liste) {
  sende an c den Info-String
}
```

derartiger Code ist schwer?


----------

