String über Sockets versenden - ObjectOutputStream/ObjectInputStream

Stimmt out ist null.... :/
Nur wieso? ich habe die Variable ja in der Klasse definiert, bei der Methode connect(die ich aufrufe) wird sie dann gefüllt, was laut debugger auch funktioniert.
Nur in der Methode sendMessage ist sie wieder null.... :confused:
 
Stimmt out ist null.... :/
Nur wieso? ich habe die Variable ja in der Klasse definiert, bei der Methode connect(die ich aufrufe) wird sie dann gefüllt, was laut debugger auch funktioniert.
Nur in der Methode sendMessage ist sie wieder null.... :confused:

Also eine Idee hätte ich da noch:
beim klicken des Buttons wird die Methode "sendMessage" in der Client Kasse aufgerufen:
Java:
    private void button_sendMessageActionPerformed(java.awt.event.ActionEvent evt) {                                                   
    // TODO add your handling code here:
        Client send = new Client(this.textArea_conversation,this.textField_sendMessage);
        send.sendMessage();
    }
D.h. jedes Mal wenn du auf den Button klickst wird ein neuer Client erzeugt. Und hier seh ich halt nicht den Connect()-Aufruf. Oder überseh ich da was?
 
Mhh nein der Connect Aufruf wird mit einem anderen Button in einer Menubar aufgerufen

hier:

Java:
    private void menuItem_connectServerActionPerformed(java.awt.event.ActionEvent evt) {                                                       
    // TODO add your handling code here:
        Client client = new Client(this.textArea_conversation,this.textField_sendMessage);
        try {
            client.connect();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

muss ich das connect etwa in einem Thread machen damit das die ganze Zeit Läuft und die Variable erhalten bleibt oder was?

Achja vielen Dank für deine Mühe bisher :)
 
Also das Problem ist, dass du ständig neue Client-Objekte benutzt. Jedes neue Client-Objekt hat erstmal out auf null. Weil jedes Objekt hat ja seine eigenen Variablen.

Das ganze in einem Thread zu machen und nicht immer wieder neu zu erzeugen halte ich im Moment für die beste Idee (vor allem weil du den Socket ja öffnest und dann nicht wieder zumachst). Wenn du unbedingt ständig neue Client-Objekte erzeugen willst, müsste das auch gehen indem du die out-Variable static machst. (Ist jetzt wo der Rest vom Code schon steht am einfachsten). Aber das wäre unschön - also 1 Thread pro Server, der Daten empfangen soll ... ich denke so würde man das normalerweise machen.
 
Das mit dem Static funktioniert :D

Nur scheint es ja nicht gerade optimal zu sein.
Ich habe jetzt grad nicht so eine Ahnung wie ich es mit dem Thread machen müsste.
 
Naja, jetzt wo ich so darüber nachdenke ... du sendest eine Nachricht indem du einen neuen Client erzeugst und wartest dann drauf, dass der Client vom GarbageCollector wieder gelöscht wird ... doch, kann man machen. Sollte auch nicht zu Problemen führen :)

Allerdings bringt dir das nichts. Weil du startest die Clients, die die Nachrichten wirklich senden, ja nicht als Thread. Du rufst die send-Methode auf und wartest in deinem Hauptprogramm, dass das ganze mit Senden fertig ist. Bei dieser Art kannst du dir den Client auch sparen und die Nachricht direkt raussenden. Ist der gleiche Effekt. Normalerweise würde man den Client vielleicht benutzen um direkt weiterarbeiten zu können und um nicht evtl. TimeOut-Exceptions oder ähnliches abwarten zu müssen. Aber solange es wirklich nur ein Chat ist ... würde man das mit den Threads am besten sowieso ganz vergessen. Also Server und Client als eigenständige Programme schreiben und fertig.

dontschew hat ja schon geschrieben, wie man das machen würde.
 
Ok das leuchtet schon ein nur müsste ich das jetzt irgendwie so hinkriegen das der Server alle empfangenen Nachrichten an alle verbundenen Clients zurückschickt.
Dass dann im CLientprogramm alle an den Server gesendeten Nachrichten angezeigt werden können.

Hast du oder sonst jemand eine Ahnung wie ich das machen kann, so eine Art Broadcast.
 
Naja, ich hab leider gerade keine Zeit dir ein Programmierbeispiel zu geben ... aber Google sollte gerade bei Chat und Java massenhaft Ergebnisse ausspucken.

Broadcast würde ich nicht verwenden. Kann man zwar machen, aber in deinem Fall weißt du ja, welche Clients vorhanden sind (es steht ja eine Socket-Verbindung zu ihnen).
Also prinzipiell würde ich wie folgt vorgehen: Du hast im Server vermutlich auch einen ServerSocket geöffnet. Wenn dieser mit irgendwas verbunden wird, wird ein neuer Socket erzeugt. Dein ServerSocket sollte in einer Endlosschleife sein :)
Außerdem musst du dir den neuen Socket irgendwo wegspeichern (Vector, ArrayList, was auch immer).
Dann musst du einen neuen Thread erzeugen (einen neuen pro Verbindung) und versuchst in einer Endlosschleife aus dem Socket zu lesen. Wenn Daten reinkommen durch den InputStream gibst du die am besten an den Hauptthread zurück und sendest die von da an alle anderen Clients. (Soll heißen, dass ich die Methode zum Versenden an alle Clients mit in den ersten Thread packen würde, der den ServerSocket erzeugt hat, weil dort die komplette Liste mit allen Clients liegen sollte). Der Thread zum Empfang der Nachrichten von einem Client braucht also einen Verweis auf den Hauptthread und Socket als Parameter.

Clientseitig brauchst du jetzt auch einen zweiten Thread. Dieser bekommt den InputStream vom Socket und versucht ununterbrochen (und in einer Endlosschleife) draus zu lesen (Lesen ist meistens eine blockierende Anweisung, deswegen ist hier der neue Thread nötig). Und das war's eigentlich auch schon. Das eingelesene muss natürlich noch irgendwo ausgegeben werden.

Hmm ... erklären war ich noch nie gut drin. Aber Google müsste zu dem Thema eigentlich auch genug ausspucken :)
 
Zurück