# Chat Server programmieren



## Lauritz (20. Jan 2013)

Hi Leute,
ich hab folgendes Problem und zwar bearbeiten wir grade das Thema Netzwerkprogrammirung.
Die Landesregierung hat zur bearbeitung der Themen bestimmte Klassendokumentationen vorgegeben die verwendet werden sollen. Von diesen, da wir sie auch nicht im Untericht bearbeiten werden, verstehe ich eigentlich so gut wie nichts. Allerdings ergibts sich für mich ein Problem: und zwar kann ich meinen Chat Server nur per "localhost" ansteuern und nicht per IP addresse. Ich denke das liegt daran, dass die Vorgegebenen Klassen einen Fehler beinhalten. Es wäre nett wenn sich vielleicht jemand mal die Zeit nehmen würde und mir vielleicht helfen könnte um den Fehler zu korrigiren. Im folgenden mal die Klassendokumentationen.

Die wesentliche Code Zeile die bei mir auf die Oben genannten klassen zugreift ist wie folgt:

```
public ChatClient()
    {
        super("87.189.56.124", 29001);
        //eingabe = new BufferedReader(new InputStreamReader(System.in));
        gui = new GUI(this);

    }
```

hier wird ein Error angegeben bei der verwendeten IP addresse.


Lauritz


----------



## Marcinek (20. Jan 2013)

Welcher Fehler kommt?

Vermutlich stören Firewall / Router Port-Forwarding.


----------



## tröööt (20. Jan 2013)

Spoiler: Off Topic



ähm ... tja ... was soll man dazu sagen ...

ist der code von dir ... oder vorgegeben ? ist eigentlich egal ... der autor dieses codes hat scheinbar keine ahnung wie man das keyword "abstract" richtig verwendet ...
außerdem fehlen die implementierungen ... die solltest du auch posten ...

was mir schon wieder angst macht ist "import listenklassen.List;" ... sieht schon wieder sehr "professionell" aus ... so in richtung 7te klasse info mit blueJ ... einfach nur lächerlich ...

und zu dem ganz unten : "hier wird ein Error angegeben bei der verwendeten IP addresse" ... wie wäre es dann wenn du diesen einfach mal posten würdest ? ...

grob ins blaue geraten würde ich hier auf NAT und/oder firewalls tippen die die verbindung blockieren ... (btw : könnte mal bitte ein admin die public-IP rauseditieren)


[standard-antwort bei solchen usern]

wenn du genau NULL verstehst ... tja ... dann fehlen dir grundlagen ... und du wirst wohl in der zeit wo diese vermittelt wurden nicht da gewesen sein ... gleich ob köperliche oder geistige abwesenheit ... aber ganz erlich : NIEMAND ... aber auch wirklich NIEMAND ... der seinen job als "lehrkraft" auch nur halbwegs ernst nimmt ... wird dir eine solche aufgabe stellen OHNE das dir vorher nicht die nötigen grundlagen vermittelt wurden ...

wenn du diese nicht verstanden hast oder wie schon gesagt abwesend warst ... dann ist es deine schuld ... denn ein lehrer wird schließlich dafür bezahlt seinen schülern was beizubringen ... nur das mit dem : "hat noch wer fragen" ... sollte man auch wirklich ernst nehmen und sagen : "ja hier ich" ... wenn man es halt nocht nicht ganz sicher verstanden hat ... wer das nicht macht ist ab ende schlicht und ergreifen : *selbst schuld* ... und hat eine mögliche nicht-positive bewertung *verdient*

mal ganz davon abgesehen : das thema "java chat" wurde weltweit schon mehr als zu genüge durchgekaut ... man sollte als info-schüler/-studend/-azubi schon mal in der lage sein google selbstständig zu nutzen um antworten auf seine fragen zu finden wenn man "programmieren" will ... denn wenn man nicht mal weis wie ein rechner funktioniert sollte man auch nicht versuchen wollen ihm zu sagen was er zu tun und zu lassen hat ...

[/...]


----------



## Network (20. Jan 2013)

Kommt drauf an:
- Wenn du versuchst dich von einem Computer zu verbinden der außerhalb des lokalen Netzwerks liegt, musst du selbstverständlich die Ports im Router dafür weiterleiten (Eventuell Firewall einfach mal abschalten).
- Wenn du versuchst dich auf einen Computer innerhalb des lokalen Netzwerk zu verbinden wird normalerweise standardmäßig [ts=In Firmennetzwerken, Schulnetzwerken oder allgemein öffentlichen Fremdnetwerken kann es natürlich passieren, das auch soetwas mit der oben beschriebenen Methode gelöst werden muss.]nichts dagegen eingreifen[/ts].
Es könnte deshalb in diesem Fall noch daran liegen, dass du die öffentliche IP-Addresse verwendest anstatt der lokalen. (Die lokale ist meistens 198.168.2.100 oder so ähnlich)

Gruß
Net


----------



## Lauritz (20. Jan 2013)

hi danke für die schnelle antwort, ich versuche mal ob dies mein Problem lösen könnte. Nachdem ich den Port geöffnet habe wurde eine Verbindung hergestellt  , allerdings wurde diese inerhalb kurzer Zeit, also bevor ich Nachrichten senden konnte wieder getrennt. Das deaktiviren der Firewall hat zu keiner Veränderung geführt.

es wird folgende Fehlermeldung ausgegeben:


```
java.net.ConnectException: Connection timed out: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
	at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
	at java.net.Socket.connect(Socket.java:529)
	at java.net.Socket.connect(Socket.java:478)
	at java.net.Socket.<init>(Socket.java:375)
	at java.net.Socket.<init>(Socket.java:189)
	at netzklassen.Connection.connect(Connection.java:55)
	at netzklassen.Connection.<init>(Connection.java:36)
	at netzklassen.Client.<init>(Client.java:84)
	at ChatClient.<init>(ChatClient.java:19)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at bluej.runtime.ExecServer$3.run(ExecServer.java:740)
Exception in thread "Thread-4" java.lang.NullPointerException
	at netzklassen.Connection.receive(Connection.java:74)
	at netzklassen.Client$Clientempfaenger.run(Client.java:59)
```

und an tröööt es würde mich freuen wenn ihr nur konztruktive kritik anbringt das wäre sehr hilfreich  ich habe ja bereits in der Beschreibung des Themas angegeben das wir diesen Teil nicht im Untericht behandeln werden und nicht behandelt haben, daher finde ich es nicht sehr freundlich meine Lehrkraft oder mich dafür verantwortlich zu machen. Wenn du nicht das Interesse verspürst mir zu helfen dann halte dich doch bitte aus den Thema raus.


----------



## tröööt (20. Jan 2013)

Spoiler: Off Topic



sorry ... und ich weis das ich mich jetzt mit diesem ton wahrscheinlich stark unbeliebt machen werden ... aber du kannst deiner lehrkraft bitte folgendes ausrichten :

wenn man einen so verkramten sauhaufen von GAR NICHTS an den tag legt und als lehrer selbst nichts drauf hat weil man mal wieder nur einer der unschuldigen ist die als "ersatz" eingespannt wurden weil es keinen fachlehrer gibt ... dann soll man den job entweder nicht antreten ... oder wenn mans schon macht ... nicht seine schüler dafür bluten lassen das man selbst nichts auf die reihe bekommt ... aufgaben zu stellen ohne das nötige wissen zu vermitteln ist absoluter BULLSHIT ... was man auch im studium , wo man zwar von ausgehen kann das ein studend google nutzen kann ... dies aber nicht die regel ist , nicht unbedingt zum standard werden lassen sollte ...



back to topic und wieder in normalen ton

klar will ich dir helfen ... nur wird das halt leider etwas schwierig wenn du uns nur sagst DAS halt irgendwas nicht ganz rund läuft ... aber eben nicht WAS ...
viele hier können bei solchen aufgaben meiste einige faktoren ausschließen und so halbwegs treffsicher ins blaue raten woran es liegen könnte ... und einige haben damit erfolgschance über 90% ... aber wenn man ein problem hat sollte man dies auch möglichst gut umschreiben damit der jenigen der helfen möchte auch halbwegs weis worum es geht und wo das problem sein könnte ...

und die hinweise auf die in meinen augen hier defintiv falsch anwendung von "abstract" und der hinweis das du den fehler auch mal bitte posten solltest waren sachlich und fachlich und in keinster weise im zusammenhang mit dem unteren block oder gar aus einem beweggrund herraus dir nicht helfen zu wollen ... weshalb der persönliche block auch (wenn eher dürftig) gesondert gekennzeichnet wurde ...

das ich im stack blueJ lesen wundert mich nicht ... ich hab ja schon drauf angespielt ... und soweit kann man , auch wenn für den stack noch einiges fehlt , den code soweit nachvollziehen das halt beim verbinden zum server was schief läuft ... nämlich in der zeile wo "new Socket()" gecallt wird ...
das dann nicht darauf reagiert wird und das programm trotzdem weiterläuft führt dann später zur NPE ... hier solltest du dir unbedingt das thema "exceptionhandling" zu gemüte führen und üben dies richtig anzuwenden ... sonst werden dir solche fehler immer wieder passieren ...


und wie bereits erwähnt : du gibst eine public WAN-IP an ... und mit dieser kommt eine verbindung nicht zu stande ... und die hauptfehlerursache dafür ist meistens eine NAT-firewall in einem router ... also diese mal kontrollieren und "port forwarding" aktivieren ...

[edit]das die verbindung getrennt wird könnte am weiteren code-ablauf liegen ... aber um diesen komplett zu analysieren müsstest du dann auch wirklich mal bitte den GESAMTEN code posten[/edit]


----------



## Network (20. Jan 2013)

Also Zeile 55 in der Methode connect der Klasse connection tritt eine timed out exception auf. Klar timed out bedeutet, dass das der Client keine Antwort mehr vom Server bekommt. Darum musst du dich nicht kümmern, das macht das TCP-Protokoll in Java automatisch.

Da dass aber in dem Teil des Codes passiert der erst die Verbindung aufbaut (new Socket()) hat sich dein Client entweder noch nicht mit dem Server verbunden - aber du sagtest ja die Client und Server hätten sich verbunden... versucht ein dritter Client sich zu verbinden?
(Kann auch der selbe sein, der nochmal versucht eine Verbindung aufzubauen)
Dann wartet danach der Server nähmlich nicht mehr mit "accept()" oder der Port ist noch belegt.

Ich bin noch nicht hinter den JavaCode gestiegen was wie wo warum läuft, insbesondere so spät. Deshalb kann ich noch keine genaue Aussage treffen woran es liegt. Wie gesagt die Klassen sind irgendwie völlig unordentlich ineinander verwurstet. Es gibt keine Client-Klasse und Server-Klasse, sondern die beinhalten alle sich selbst Privatklassen die von Abstractklassen erben und... ach hols der Geier...


----------



## Lauritz (20. Jan 2013)

Hi danke für all die netten antworte. Ich bin jetzt so weit, dass ich von meinem PC über die IP addresse auf den Server zugreifen kann. Allerdings ist das nicht möglich von anderen PCs, dies liegt denke ich daran wie ihr schon sagtet an der Firewall. Ich guck mal ob ich da noch weiterkomme wenn ich das ausschalte. 

und noch einmal an töööt, nur um meinen Lehrer mal zu verteidigen, er hat rellativ wenig einfluss auf die gegebenen Klassen. Diese werden von der Landesregierung vorgegeben und so auch im Zentralabitur verwendeet. Die Klassen können, bzw sollten daher nicht von den Lehrkräften verändert werden. Aber trozdem danke für deine tipps


----------



## AndiE (20. Jan 2013)

Das gehört noch dazu ...

```
package clientServer.chatServer;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import abiturklassen.netzklassen.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 13.06.2006
  * @author
  */
public class CServer extends JFrame {
  // Anfang Variablen

  // Anfang Attribute
  private JButton jButton1 = new JButton();
  private JLabel jLabel1 = new JLabel();
  private ChatServer chatServer=new ChatServer();
  // Ende Attribute

  // Ende Variablen

  public CServer(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 181;
    int frameHeight = 180;
    setSize(frameWidth, frameHeight);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jButton1.setBounds(40, 80, 75, 25);
    jButton1.setText("Stop");
    cp.add(jButton1);
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1ActionPerformed(evt);
      }
    });

    jLabel1.setBounds(32, 24, 99, 24);
    jLabel1.setText("Chat-Server");
    jLabel1.setFont (new Font("MS Sans Serif", Font.PLAIN, 17));
    cp.add(jLabel1);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden

  // Anfang Ereignisprozeduren
  public void jButton1ActionPerformed(ActionEvent evt) {
    chatServer.close();
    System.exit(0);
  }

  // Ende Ereignisprozeduren

  public static void main(String[] args) {
    new CServer("ChatServer");
  }
  // Ende Methoden
}
```


```
package clientServer.chatServer;

import abiturklassen.netzklassen.*;
import abiturklassen.listenklassen.List;

public class ChatServer extends Server {

    final String ENDE = "*bye*";

    public ChatServer() {
      super(2000);
    }

    public void processNewConnection(String pClientIP, int pClientPort) {
      this.send(pClientIP, pClientPort, "Willkommen " + pClientIP + " auf Port "
        + pClientPort + " bei unserem chat!");
      this.sendToAll(pClientIP + " " + pClientPort + " hat sich angemeldet.");
    }

    public void processMessage(String pClientIP, int pClientPort, String pMessage) {
      if (pMessage.equals(ENDE))
        this.closeConnection(pClientIP, pClientPort);
      else
        this.sendToAll(pClientIP + " " + pClientPort + ": " + pMessage);
    }
    
    public void processClosedConnection(String pClientIP, int pClientPort) {
      this.send(pClientIP, pClientPort, pClientIP + " " + pClientPort +
      " Danke fuer die Teilnahme an unserem Chat.");
      this.sendToAll(pClientIP + " " + pClientPort + " hat sich abgemeldet.");
      this.send(pClientIP, pClientPort, ENDE);
    }
}
```


```
package clientServer.chatClient;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import abiturklassen.netzklassen.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 13.06.2006
  * @author
  */
public class CClient extends JFrame {
  // Anfang Variablen

  // Anfang Attribute
  final String ENDE="*bye*";
  private ChatClient hatChatClient;
  private JLabel jLabel1 = new JLabel();
  private JTextField jTextField1 = new JTextField();
  private JButton jButton1 = new JButton();
  private JButton jButton2 = new JButton();
  private JScrollPane jScrollPanejTextArea1 = new JScrollPane();
  private JTextArea jTextArea1 = new JTextArea("");
  private JLabel jLabel2 = new JLabel();
  private JTextField jTextField2 = new JTextField();
  private JButton jButton3 = new JButton();
  // Ende Attribute

  // Ende Variablen

  public CClient(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 514;
    int frameHeight = 373;
    setSize(frameWidth, frameHeight);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jLabel1.setBounds(16, 16, 40, 16);
    jLabel1.setText("Server");
    jLabel1.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel1);
    jTextField1.setBounds(64, 16, 121, 24);
    jTextField1.setText("");
    cp.add(jTextField1);
    jButton1.setBounds(200, 16, 110, 24);
    jButton1.setText("Anmelden");
    cp.add(jButton1);
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1ActionPerformed(evt);
      }
    });

    jButton2.setBounds(328, 16, 110, 24);
    jButton2.setText("Beenden");
    cp.add(jButton2);
    jButton2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton2ActionPerformed(evt);
      }
    });

    jScrollPanejTextArea1.setBounds(8, 48, 438, 241);
    jTextArea1.setText("");
    jScrollPanejTextArea1.setViewportView(jTextArea1);
    cp.add(jScrollPanejTextArea1);
    jLabel2.setBounds(8, 304, 56, 16);
    jLabel2.setText("Nachricht");
    jLabel2.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel2);
    jTextField2.setBounds(72, 304, 249, 24);
    jTextField2.setText("");
    cp.add(jTextField2);
    jButton3.setBounds(328, 304, 110, 25);
    jButton3.setText("Abschicken");
    cp.add(jButton3);

    jButton3.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton3ActionPerformed(evt);
      }
    });

    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden

  // Anfang Ereignisprozeduren
  public void jButton1ActionPerformed(ActionEvent evt) {
    String lServerIP=jTextField1.getText();
    if (lServerIP.length()>0) {
       hatChatClient=new ChatClient(lServerIP, jTextArea1);
    }
  }

  public void jButton2ActionPerformed(ActionEvent evt) {
     hatChatClient.close();
  }

  public void jButton3ActionPerformed(ActionEvent evt) {
    String lNachricht=jTextField2.getText();
    if (lNachricht.length()>0) {
      hatChatClient.send(lNachricht);
    }
  }

  // Ende Ereignisprozeduren

  public static void main(String[] args) {
    new CClient("CClient");
  }
  // Ende Methoden
}
```


```
package clientServer.chatClient;
import javax.swing.*;
import abiturklassen.netzklassen.*;

public class ChatClient extends Client {

  final String ENDE = "*bye*";
  JTextArea textbereich;
  
  public ChatClient(String serverIP, JTextArea pTextbereich){
    super(serverIP, 2000);
    textbereich=pTextbereich;
  }
  
  public void processMessage(String pMessage){
     if (this.istVerbunden())
       if (pMessage.equals(ENDE))
         this.close();
       else
         textbereich.setText(textbereich.getText() + "\n" + pMessage);
  }
  
  public void disconnect() {
    this.send(ENDE);
  }
}
```


----------



## tröööt (20. Jan 2013)

Lauritz hat gesagt.:


> und noch einmal an töööt, nur um meinen Lehrer mal zu verteidigen, er hat rellativ wenig einfluss auf die gegebenen Klassen. Diese werden von der Landesregierung vorgegeben und so auch im Zentralabitur verwendeet. Die Klassen können, bzw sollten daher nicht von den Lehrkräften verändert werden. Aber trozdem danke für deine tipps



es geht nicht darum von wem die klassen kommen ... sondern darum das dein lehrer scheinbar mit dem stoff noch nicht so weit war und euch entsprechend nicht vorbereitet hat ... und das IST ein fehler der lehrkraft ... denn wenn der von "oben" druck bekommt für ne zentral-arbeit ... dann sollte er sich auch n plan machen und euch soweit drauf vorbereiten das ihr auch wenigstens ne chance habt ...
weil so wie es rüberkommt kümmert es ihn ja scheinbar nicht wenn ihr schlechte noten bekommt nur weil er es versemmelt hat .. danke ... gegen solche leute bin ich schon erfolgreich vorgegangen ...


----------



## Lauritz (21. Jan 2013)

Ich denke nicht das Unser Lehrer schlecht ist und bin ziemlich zufrieden mit Ihm, muss das einfach mal sagen. Meiner meinung nach ist er engagiert und bereitet uns sehr gut aufs abi vor. Auch wenn die diskusion hier nicht hingehört finde ich es sehr unhöflich über Menschen zu Urteilen die man weder kennt noch je erlebt hat und daher denke ich ist es nur recht wenn ich jetzt darum bitte solche Aussagen, bzw. Anspielungen zu unterlassen und nicht weiter in diese richtung zu agumentiren. Dies behebt weder mein Problem noch bring hier jemanden nach vorne.


----------

