Android (Java) Socket ist immer NULL

  • Hallo,
    ich bin neu im Forum :thumbup:
    Also ich habe ein Problem ich habe ein Thread wo eine Verbindung zu meinem PC also zu einem Server aufgebaut wird
    aber wenn ich eine nachricht sende kommt der fehler das der Socket null was ich aber nicht verstehe


    Fehler: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.OutputStream java.net.Socket.getOutputStream()' on a null object reference

    hier der source code

    MFG Knimix
    ________________________________________________________________________________________


    public class Connection {
    Thread con;
    Thread send;
    private Socket socket = null;
    private String ip;
    private int port;


    public Connection(String ip, int port) {
    this.ip = ip;
    this.port = port;


    }

    public void connect() {

    if (con != null) {
    con.stop();
    }

    con = new Thread(new Runnable() {
    @Override
    public void run() {
    try {
    socket = new Socket(ip, port);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    });

    con.start();


    }


    public void send(final String text) {

    try {

    PrintWriter p = new PrintWriter(socket.getOutputStream());
    p.write(text);
    p.flush();
    p.close();

    } catch (IOException e) {
    e.printStackTrace();
    }

    }


    }

  • Also ich habe jetzt mal nachgeschaut ich habe jetzt den String zu einem Objekt gemacht ich bekomme aber immer noch den Error
    socket = new Socket(InetAddress.getByName(ip), port);
    Wenn das so richtig
    Ps ich bin noch Anfänger

  • Ich will nochmal zusammen fassen : Die Verbindung klappt super! Aber wenn ich die Methode sendText aufrufe wird mir gesagt das der Socket null ist wenn ich das ganze direkt nachdem ich den Server erstellt habe (also new Socket(bla,bla)) dann klapp das aber sobald ich auserhalb auf den socket zugreifen will ist das ein null objekt
    also irgendwie wird die Variable Socket nicht gespeichert

    MFG Knimix

  • erkläre mal etwas genauer.
    Von wo willst zugreifen? Wo ist der Code den du gepostet hast.
    Wenn du zb. In einer activity die Verbindung aufbaust und in einer anderen Aktivity wieder eine neue Instanz deiner vermeintlichen Klasse erstellst ist das nicht die gleiche Instanz und somit hast du auch andere Daten in der Klasse.

  • Wie du hoffentlich siehst gibt es mehre Methoden also den Konstruktor "Connection" und die Methode "connect" mit der Methode connect starte ich ein Thread wo die Variable socket die ja null ist zu einem neuen Socken gemacht wird.Die Methode sendText(String text) sendet ein Text zum Server dafür Brauchs sie die variable Socket die aber immer null ist obwohl die ja in der Methode connect auf den socket gesetzt wird.

    ;

  • VOn der main hier der code der ist von einem Button

    public void onclick(View view){
    Connection con = new Connection("localhost",1980);
    con.connect();
    con.send("hallooo");
    // con.disconnect();


    }

    Einmal editiert, zuletzt von Knimix (24. Januar 2019 um 21:47)

  • was ich wissen wollte ist Ob du immer die gleiche Instanz deiner Klasse benutzt oder ob du in einer anderen activity wieder eine neue Instanz deiner Klasse erstellst.

    Bei ei er neuen Instanz sind alle Daten wieder auf null. Ist ja ach ein anderes Objekt. Wenn du nun die Verbindung mit dem einem Objekt erstellst und mit einem anderen Objekt senden willst kann das nicht gehen. Weil das zweite Objekt nicht das socket vom ersten hat.

    Ps Post haben sich Überschnitten.

    Einmal editiert, zuletzt von nono124 (25. Januar 2019 um 09:56)

  • Aber ich wenn ich die klasse aufrufe und dann die methode wird doch keine neue Instanz erstell sondern es bleibt die gleiche

    Connection con = new Connection("localhost",1980);
    con.connect();
    con.send("hallooo");

    Einmal editiert, zuletzt von Knimix (24. Januar 2019 um 21:48)

  • Wenn ich mit new Connection() einen neuen Socket starte wird die Variable in der Instanz "gespeichert" in der gleichen Instanz rufe ich die Methode connect() auf die den Socket verbindet und dann will ich vom Socket eine nachricht senden wofür ich den Socket brauch der immer noch eigentlich in der Variable ist dass ist er aber nicht und meine frage ist warum

  • Du erstellst die Verbindung in einem eigenen thread.
    One zu prüfen ob der thread fertig ist und die Verbindung steht.
    Sendest du schon.
    Wenn du es ohne thread machst geht das da der sende Befehl warten muss bis die Verbindung steht.
    Du startest das senden und Verbindung aufbauen quasi zur selben Zeit.

    Baue die Verbindung vorher auf zb In der onRenume Methode und In der onpause wieder beenden.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!