# Problem mit readLine ---- und mit dem connecten



## PrinzMartin (12. Okt 2007)

Moin Moin

ich versuche seit längerem schon auf Sockets basierend einen Chat zu programmieren nicht für irgend wen oder irgend was sinnvolles sonder einfach nur um mir zu beweisen, dass ich es kann :wink: 

Naja ich versuche es halt immer wieder wenn wir in Info was neues gemacht haben von dem ich denke, dass das der Schlüssel zur Lösung ist und jedesmal werde ich wieder enttäuscht ;-)

Naja jetzt haben wir die GUI tiefer besprochen und ich denke da sind meine Probleme jetzt gelöst... ich arbeite mit folgendem Beispiel um das grundlegende von Sockets zu verstehen


Client.java:



```
import java.lang.*;
import java.io.*;
import java.net.*;

class Client {
   public static void main(String args[]) {
      try {
         Socket skt = new Socket("localhost", 1234);
         BufferedReader in = new BufferedReader(new
         InputStreamReader(skt.getInputStream()));
         System.out.print("Received string: '");

         while (!in.ready()) {}
         System.out.println(in.readLine()); // Read one line and output it

         System.out.print("\n");
         in.close();
      }
      catch(Exception e) {
         System.out.print("Whoops! It didn't work!\n");
      }
   }
}
```


Server.java:


```
import java.lang.*;
import java.io.*;
import java.net.*;

class Server {
   public static void main(String args[]) {
      String data = "Ich bin ein String";
      try {
         ServerSocket server = new ServerSocket(1234);
         Socket socket = server.accept();
         System.out.print("Server has connected!\n");
         PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
         System.out.print("Sending string: '" + data +"'\n");
         out.print(data);
         out.close();
         socket.close();
         server.close();
      }
      catch(Exception e) {
         System.out.print("Whoops! It didn't work!\n");
      }
   }
}
```


Leider "verschluckt" das Internet etwas und zwar das >'< vor dem zeilenumbruch am ende auch wenn ich es per +"'"+"\n" mache kommt es nicht an obwohl da steht, dass es mitgesendet wurde.....


Da hatte ich schon mal ein Problem und hab mich dann erst mal mit der GUI beschäftigt aber jetzt bin ich wieder da angekommen und weiß nicht weiter weil ich mich wirklich noch nicht so mit den Sockets auskenne.....

ich hoffe ihr könnt helfen

grazie in anticipo


----------



## SlaterB (12. Okt 2007)

was genau kommt denn an?, verwende ein Beispielwort 'Hello',
sende viele ' hintereinander: ''''''''''''''''''''''''''''''''''

zähle die gesendeten und empfangenen Chars,
verwende direkt einen Stream und lies die Anzahl der Bytes
usw (das waren jetzt viele Vorschläge für viele Versuche)


----------



## PrinzMartin (12. Okt 2007)

Ok danke sehr es lag an meiner totalen verwirrtheit was sockets angeht ich hab die falsche Codestelle betrachtet.

Die die ich mir angeschaut hab war gar nicht für das Senden verantwortlich    


Da stand ich irgend wie total aufm Schlauch^^

danke sehr jetzt hoffe ich mal, dass ich weiterkomme


----------



## PrinzMartin (12. Okt 2007)

Sooooooo ich habe wieder einen Fehler für euch ;-)


```
Starte C:\Dokumente und Einstellungen\Martin\Desktop\Server\Server_GUI.java

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
 at cInteraktion.btn_connectActionPerformed(cInteraktion.java:36)
 at Server_GUI$2.actionPerformed(Server_GUI.java:58)
 at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
 at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
 at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
 at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
 at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
 at java.awt.Component.processMouseEvent(Component.java:5488)
 at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
 at java.awt.Component.processEvent(Component.java:5253)
 at java.awt.Container.processEvent(Container.java:1966)
 at java.awt.Component.dispatchEventImpl(Component.java:3955)
 at java.awt.Container.dispatchEventImpl(Container.java:2024)
 at java.awt.Component.dispatchEvent(Component.java:3803)
 at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
 at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
 at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
 at java.awt.Container.dispatchEventImpl(Container.java:2010)
 at java.awt.Window.dispatchEventImpl(Window.java:1778)
 at java.awt.Component.dispatchEvent(Component.java:3803)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
 at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
```


So das ist der Fehler aber erst mal wie es dazu kommt.

ich gehe einfach mal ganz genau den weg den das Programm geht, soweit ich das nochvollziehen kann...

es startet in der GUI sobald ich auf den Button "connect" klicke


```
btn_disconnect.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        btn_disconnect.btn_disconnectActionPerformed(evt);
      }
```

Das verweist ja auf ein Objekt, welches Typ meiner Klasse für die Button Actions ist, sie heißt "cInteraktion" und extends JButton...
darin steht dann die Action:


```
public void btn_connectActionPerformed(ActionEvent evt)
  {
    server.connect();
    
    if(server.getConnected() == true)
    {
      status.setBackground(Color.GREEN);
    }
    else
    {
      status.setBackground(Color.RED);
    }

  }
```

Das verweißt ja auf das Objekt "server" der Klasse cServer in der folgende "connect()" Methode steht:


```
public void connect()
  {
     try {
          server = new ServerSocket(1234);
          socket = server.accept();
          out = new PrintWriter(socket.getOutputStream(), true);
          in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          connected = true;
        }
      catch(IOException e) {
         connected = false;
      }
  }
```



So das war es auch shcon, ich hoffe das ist nicht zu viel für euch mich wundert nur, dass die Klassen an sich alle laufen nur wenn ich aus der GUI heraus die "connect()" Methode aufrufe bekomme ich einen Fehler... bei einem Testprogramm ohne GUI bekomme ich den Fehler nicht.....


ich hoffe ihr könnt helfen

grazie in anticipo


----------



## SlaterB (13. Okt 2007)

in 
  server.connect(); 
ist offensichtlich server null, einfach nachzuprüfen mit
System.out.println("server ist: "+server);
eine Zeile zuvor

wo server angelegt wird schreibst du nicht, da kann man also nichts zur Ursache sagen


----------



## PrinzMartin (13. Okt 2007)

Moin Moin

Sicher ist server "null"

und das wird aber in connect auch genau so gewollt denn direkt in der ersten anweisung im try block wird server gesetzt....

ich habe jetzt ein programm genommen das keine gui hat und habe einfach in der main ein objekt des servers erstellt welches dann die connect methode aufruft....

auch da ist server = null wird auch angezeigt wenn ich es ausgeben lasse.... dann läuft aber alles wunderbar durch undnach dem connecten ist server = naja es ist halt was ich hab mir nicht aufgeschrieben was da stand aber es läuft...


ich check aber noch mal ob ich vllt irgend wo was vergessen habe aber das server vor dem connecten = null ist ist doch eigentlich nicht falsch oder?


----------



## SlaterB (13. Okt 2007)

..

mit server.connect(); ist doch offensichtlich den Aufruf der connect.Operation,
nicht irgendwas in connect() drin,
die Operation wird gar nicht erst aufgerufen, da das Objekt server in  btn_connectActionPerformed() null ist 
oder irgendwas anderes dort ist null,

die Fehlermeldung sagt dir die genaue Zeile und dort können ja nicht mehr als 1-2 Objekte berührt werden,
ist also ein Kinderspiel, so einen Fehler zu finden..


----------



## PrinzMartin (13. Okt 2007)

also ich habe es jetzt anders gelöst daher ist das eigentlich nicht mehr so wichtig aber verstehen tue ich es immer noch nicht denn naja ich weiß schon was du meinst und ich würde es ja auch so sagen, aber irgendwie liegt mir die lösung trotzdem verborgen...

wenn ich 

server.connect() aufrufe, dann kommt ja der fehler....

ich bin mir aber ganz sicher ein objekt der server klasse gemacht zu haben und naja das ist vllt kein kriterium aber wenn ich server. schreibe, dann wird auch sinnvoll mit connect() ergänzt........

also sogar der Java Editor kennt die Funktion^^

jetzt beschäftige ich mich gerade mit dem PrintWriter, da ich den nicht immer schließen möchte, damit die line als abgeschlossen gilt...

ich denke zumindest daran liegt das. ich hab readLine um mit dem Client zu empfangen und der gibt das erst aus, wenn der PrintWriter "geclosed" ist........ 

aber da google ich erst mal da bin ich nur gerade drauf gestoßen vllt schaff ich das ja mal so


aber danke, dass ihr euch damit beschäftigt habt.. :toll:


----------



## SlaterB (13. Okt 2007)

> also sogar der Java Editor kennt die Funktion^^ 

wäre die Operation nicht definiert, dann gäbe es einen Compilerfehler,

du hast eine NullPointerException zur Laufzeit,  der Zugriff ist im Grunde ok, aber das Objekt ist schlicht null,
dass du dir mit der Erstellung des Objektes sicher bist hat auf das Nichtvorhandensein keinen Einfluss,

warum du nicht einfach
System.out.println("server ist: "+server); 
davor schreibst und jede Diskussion beendest, verstehe ich nicht..


----------



## PrinzMartin (13. Okt 2007)

hab ich ja gemacht da kommt ja auch "null" raus also er gibt es ja aus aber ich weiß halt nicht warum.......

aber da an der Lösung eh was nicht durchdacht war und es in der neuen klappt is es ja nicht so wichtig warum vllt ein dummer fehler an einer ganz anderen stelle....


----------



## Joinocemo (14. Jan 2008)

Make love, not war!


----------

