String über Sockets versenden - ObjectOutputStream/ObjectInputStream

HuRaHoRRe

Erfahrenes Mitglied
hi

Ich habe ein kleines Problem, ich bin daran einen kleinen Client/Server chat zu schreiben...
Nun habe ich das versenden von Integers über Sockets fertiggebracht :/
Ich möchte nun aber Strings versenen und das geht mit Out/Input Stream anscheinend nicht....
Ich hab es nun nach der Suche nach einer Lösung im Internet mit ObjectInput/OutputStream
Probiert jedoch ohne Erfolg...

Ich hoffe jemand hat ne Ahnung was daran falsch ist:

Java:
public void run()
    {
           try{
           Socket server = new Socket("localhost", 1234);
             while( server.isConnected() )
             {
               ObjectInputStream in = new ObjectInputStream(server.getInputStream()); 
               ObjectOutputStream out = new ObjectOutputStream(server.getOutputStream());

               out.write(1);
               int zahlback = in.read();
               String zahl = Integer.toString(zahlback);
               textArea.setText(zahl);
               out.flush();
               in.close();
               out.close();
             }
           }
           catch(IOException e)
           {
               System.out.println(e);
           }
       }
 
Zuletzt bearbeitet:
Ich habe 2 Programme, das eine ist der Client mit Gui und das andere der Server mit Gui/Adminfunktion usw...

Nun habe ich es mit

Java:
InputStream in = server.getInputStream();
OutputStream out = server.getOutputStream();

fertiggebracht die 2 Integers auszutauschen und sie jeweils in der TextArea anzuzeigen.
Nun habe ich das ganze so wie bei meinem ersten Post umgestellt und nun wird nichts mehr in die TextArea geschrieben.
 
Hier ein kleines Beispiel.

SERVER:
Java:
public class Server {
    
    public Server() {
        try {
            java.net.ServerSocket soc = new java.net.ServerSocket(6000);            
            java.net.Socket in = soc.accept();
            java.io.InputStreamReader input = new java.io.InputStreamReader(in.getInputStream());
            
            int length=-1;
            char[] buffer = new char[4096];
            
            while(true){
                while(-1!=(length=input.read(buffer))){
                    System.out.println(
                            String.copyValueOf(buffer,0,length)
                    );
                }
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        new Server();
    }   
}

CLIENT:
Java:
public class Client {
    
    public Client() {
        try {
            java.net.Socket soc = new java.net.Socket("localhost",6000);
            java.io.OutputStream out = soc.getOutputStream();            
            
            while(true){
                
                System.out.print("Eingabe: ");
                
                String eingabe =
                    new java.io.BufferedReader(
                            new java.io.InputStreamReader(System.in)
                    ).readLine();
                
                out.write(eingabe.getBytes());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    
    public static void main(String[] args) {
        new Client();
    }
}

Wenn ich dir helfen konnte würde ich mich über ein Renommee freuen.
 
Vielen Dank für dein Besipiel :)

Hatte leider noch einige Sachen zu tun, weswegen ich nicht gleich antworten konnte.

Wenn die Nachricht im Thread und per Command Line versendet wird erhalte ich keine Fehler und der Server erhält die Nachricht und schreibt sie in die Textarea.

Soweit funktioniert es auch, nur habe ich es jetzt für meinen Zweck angepasst und für das Gui ein bisschen umgeschrieben.
Wenn ich das ganze nun so mache das die Nachricht beim klicken eines Buttons gesendet wird erhalte ich jedesmal eine "NullPointerException".

Ich werde wohl irgendwo einen Überlegungsfehler drin haben, aber ich komme im Moment leider nicht drauf wo das sein könnte.

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();
    }

Dann die Client Klasse mit sendMessage Methode:

Java:
/*
 * Client.java
 *
 * Created on 9. Oktober 2007, 10:54
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package client;

import java.io.*;
import java.net.*;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 *
 * @author lgwerm
 */
public class Client extends Thread{
    
    /** Creates a new instance of Client */
    private JTextArea textArea = null;
    private JTextField textField = null;
    private java.net.Socket soc = null;
    private java.io.OutputStream out = null;
    
    public Client(JTextArea textarea, JTextField textfield) 
    {
         this.textArea = textarea;
         this.textField = textfield;
    }
    public void run()
    {
       /*    
        try {                
            while(true){              
                System.out.print("Eingabe: ");
               
                String eingabe =
                    new java.io.BufferedReader(
                            new java.io.InputStreamReader(System.in)
                    ).readLine();             
                out.write(eingabe.getBytes());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        */
    }    
    public void connect() throws IOException
    {
         soc = new java.net.Socket("localhost",6000);
         out = soc.getOutputStream(); 
         
         this.start();
    }
    public void sendMessage() {
        
        String message = textField.getText();
        try {
            out.write(message.getBytes());     
        } catch (IOException ex) {
            ex.printStackTrace();
        }     
    }
}

Hoffe das mir noch mal jemand helfen kann bei :google: kommt man bei einer NullPointerException leider nicht gerade weit :rolleyes:
 
Hmm, sieht soweit eigentlich alles ganz gut aus. Keine Ahnung wo du da das Problem hast. Hätte ich glaub ich genauso gemacht. Das einzige wo ich drüber gestolpert bin, ist dieses String message = textField.getText(); - das kann laut API eine NullpointerException geben, wenn das zugrunde liegende Dokument null ist. Den Fall hatte ich aber noch nie. Vielleicht benutzt du einen falschen Konstruktor für dein JTextFeld?
 
Das die NullPointerException ausgelöst werden kann wenn ein objekt den wert null hat habe ich auch schon in Erfahrung gebracht, weswegen ich das ganze im Debugger angeschaut habe.
Die Variable wird ganz normal gefüllt und hat den wert des Text Feldes richtig übernommen, ist also nicht null.

Oder hast du etwas anderes gemeint?

Edit: Ich poste am besten mal die ganze Fehlermeldung vielleicht kann man daraus was lesen, also ich kanns nicht ^^

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at client.Client.sendMessage(Client.java:63)
        at client.Gui.button_sendMessageActionPerformed(Gui.java:118)
        at client.Gui.access$000(Gui.java:15)
        at client.Gui$2.actionPerformed(Gui.java:61)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6038)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
 
Zuletzt bearbeitet:
Ja, ich meinte was anderes. JTextField erbt ja von JTextComponent und da kommt deine Methode getText() her. In der API steht "Returns the text contained in this TextComponent. If the underlying document is null, will give a NullPointerException. Note that text is not a bound property, so no PropertyChangeEvent is fired when it changes. To listen for changes to the text, use DocumentListener." - Mit anderen Worten das kann ne NullpointerException geben, wenn das Dokument null ist, selbst wenn die JTextComponent initialisiert wurde. Hatte ich aber noch nicht, also was dieses Dokument sein soll, weiß ich auch nicht.

JTextField hat verschiedene Konstruktoren. Darunter auch einen, dem man ein Dokument übergeben kann. Ich dachte du hättest den vielleicht versehentlich benutzt und da null übergeben. Ich hätte halt einfach versucht das JTextField mal probeweise mit new JTextField("irgendeinText") zu initalisieren und zu schauen, was passiert.

In deinem geposteten Code seh ich ja, dass alle Variablen initalisiert werden. Also da steht die NullpointerException nicht mit bei. Muss also woanders herkommen und das wäre so eine Idee wo es halt sein könnte.

Aber deine Nullpointer-Exception verrät doch genau in welcher Zeile der Fehler auftritt. Vielleicht würde es auch schon weiterhelfen, wenn du uns verrätst wo genau die auftritt :)



Eine andere Idee wäre noch, dass du vielleicht vergessen hast, die connect-Methode aufzurufen :) ?

Und (das hat jetzt aber nichts mit der NullPointerException zu tun) ich würde nach dem out.write noch ein out.flush(); machen, sonst wunderst du dich, dass die Daten nicht ankommen :)
 
Zuletzt bearbeitet:
Habe meinen Code von oben editiert bevor ich deinen Post gesehen habe, vielleicht kannst du da was rauslesen, ich Teste das ganze jetzt einmal mit einer ganz normalen Variable.
Dann kann ich sehen ob es an dem Text Feld liegt.

Edit: Die Methode Connect rufe ich beim Klicken auf einen Button auf, das funktioniert soweit, wenn ich die nachricht im thread sende dann funktioniert es ja auch.

Hab es nun mit einem ganz normalen String anstatt dem TextFeld probiert, funktioniert nicht.
 
Zuletzt bearbeitet:
Zeile 63 ... d.h. entweder out ist null oder message ist null. Message kann eigentlich nicht null sein (weil ein leeres TextFeld ja auch immerhin "" enthält), bliebe also weiterhin die Idee, dass du die Connect-Methode nicht aufgerufen hast. Oder vielleicht hast du die aufgerufen und es tritt eine Exception auf, die du nicht bemerkst, weil du vergessen hast sie auszugeben?
 
Zurück