Server

Sulcks

Mitglied
Hallo,
Ich habe ein Problem mit einem Client in Android Studios, und zwar habe ich mir eine Klasse Client gemacht mit einer Methode zum Verbinden zum Server, diese läuft in einen neuen Thread. Dort initialisiere ich den Input/Outputstream. Wenn ich jetzt eine Nachricht mit der Methode Message schicke funktioniert das einwandfrei und kommt am Server an. Aber, wenn ich eine Nachricht vom Server empfangen will, kommt eine Fehlermeldung(java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.BufferedReader.readLine()' on a null object reference). Wahrscheinlich muss man es die Methode synchronized verwenden aber leider habe ich mich noch nicht wirklich mit Threads beschäftigt und weiß nicht genau wie das geht.
Danke im Vorhinein.
Liebe Grüße

Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class Client{
    
    private OutputStream out;
    private InputStream in;
    private BufferedReader reader;
    private PrintWriter writer;

    public void start() {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Socket client = new Socket("192.168.178.21", 5556);
                    out = client.getOutputStream();
                    writer = new PrintWriter(out);
                    in = client.getInputStream();
                    reader = new BufferedReader(new InputStreamReader(in));


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

    }

    public void message(String msg) {
        writer.write(msg);
        writer.flush();
        writer.close();
    }

    public String getServerMessage() {
        try {
            String s = null;
            StringBuilder builder = new StringBuilder();
            while((s = reader.readLine())!= null) {
                builder.append(s);
            }
            reader.close();
            return builder.toString();
        }catch (IOException e ) {
            e.printStackTrace();
        }
       return "error";
    }
}
 

kneitzel

Top Contributor
Kannst du auch den Code zeigen, wie du diese Klasse nutzt? Eine Erklärung für eine NPE kann ich an dem Code so erst einmal nicht erkennen.

Der Aufbau scheint aber etwas problematisch. Wie soll das Protokoll aussehen? Denn du schließt den Writer direkt nach dem Senden. Und der Reader liest so lange, bis die Gegenseite die Verbindung geschlossen hat?

Und der Thread soll nur die Verbindung aufbauen? Denn das Lesen blockiert ja auch und da wäre eine Schleife, die Zeilen einliest und dann an die Activity gibt, denkbar.

Das mag so gehen, wie du es derzeit hast, aber es sieht etwas dubios aus.
 

Sulcks

Mitglied
Der Server schickt eine Nachricht und die will ich in eine TextView bekommen. Der writer soll nur eine Nachricht senden, danach wird beim Server die Verbindung zum Client geschlossen.

Code:
public class MainActivity extends AppCompatActivity {
private Button send;
private EditText msg;
private TextView ServerMsg;
private Button connect;
Client client;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        init();

                send.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        client.message(msg.getText().toString());

                    }
                });
                connect.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        client = new Client();
                        client.start();
                        ServerMsg.setText(client.getServerMessage());

                    }
                });





    }private void init() {
        send = findViewById(R.id.Send);
        msg = findViewById(R.id.Message);
        ServerMsg = findViewById(R.id.ServerMsg);
        connect = findViewById(R.id.Conn);
    }
}
 

kneitzel

Top Contributor
Als Erstes Dein Problem mit der NPE:
client.start(); startet einen Thread und geht dann sofort zurück. Im Thread wird die Verbindung aufgebaut und die Variablen werden gesetzt.
Das client.getServerMessage() wird also direkt nach dem Start des Threads aufgerufen - zu einem Zeitpunkt, an dem die Verbindung noch gar nicht fertig aufgebaut wurde.

Ein schneller Fix könnte hier sein:
- Dem client übergibst Du die Activity und die TextView, die gesetzt werden soll.
- in dem Thread selbst wird dann nicht nur die Verbindung aufgebaut sondern auch die Nachricht gelesen. Nach dem Lesen der Nachricht kannst Du dann setText der TextView aufrufen. Da dies aber im UI Thread der Applikation erfolgen muss, brauchst Du die Activity, denn die bietet Dir das activity.runOnUiThread mit dem Du etwas im UI Thread laufen lassen kannst.

Von der Logik her verstehe ich das aber noch nicht so 100%: Wenn der Server die Verbindung sofort beendet, dann wirst Du da doch nichts mehr hin schicken können. Und wenn es ein zweiter Knopf ist, dann wäre auch nicht sicher gestellt, dass der erst als zweites gedrückt wird.

Evtl. ist es einfacher, sich in REST Services einzuarbeiten statt diese TCP/IP Geschichte mit Server und Client aufzubauen. Wenn es nur rein lokale Tests sind, dann ist das auch eine schnelle Sache (Da gibt es viele kleine Tutorials, die einen Rest Service in wenigen Minuten aufbauen z.B. mit Spring Boot!) und wenn es zum Thema öffentlich bereit stellen übergeht, wirst Du mit dem TCP/IP Socket massiv mehr Arbeit haben, da Du da viel mehr manuell machen musst (SSL Verschlüsselung der Verbindung, Authentication, ...) und bei z.B. Spring Boot ist da alles mit drin und mit wenig Zeilen Code umzusetzen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Server Java Basics - Anfänger-Themen 3
D Verbesserungsvorschläge zur Struktur einer Client Server Desktop Chat App Java Basics - Anfänger-Themen 24
D Unerwartetes Verhalten bei Client Server Chat App Java Basics - Anfänger-Themen 12
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
M CS GO Server mit Java steuern Java Basics - Anfänger-Themen 3
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
B DHCP-Server Adresse ermitteln Java Basics - Anfänger-Themen 4
A Client-Server Kommunikation Java Basics - Anfänger-Themen 3
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
R Antwort vom Server an mehreren Clients senden Java Basics - Anfänger-Themen 3
W Netwerkprogrammierung und Http Server Java Basics - Anfänger-Themen 10
S Server - für jeden Client ein Serverthread Java Basics - Anfänger-Themen 2
G sql server connection mit windows authentication Java Basics - Anfänger-Themen 2
N Erste Schritte Dedicated Server \ Senden und Empfangen von Daten/Befehlen Java Basics - Anfänger-Themen 2
L Erste Schritte Erste Versuche mit Server und Client Java Basics - Anfänger-Themen 7
elischa Client-Server IO und Stream Steuerung ? Java Basics - Anfänger-Themen 2
U Erste Schritte Server will nicht übergebenes Objekt speichern Java Basics - Anfänger-Themen 5
B IP Adresse von Wildfly Server Java Basics - Anfänger-Themen 1
cezary Server läßt sich nicht starten Java Basics - Anfänger-Themen 2
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
I Print Client -> Server -> Client? Java Basics - Anfänger-Themen 1
I lokales Programm mit Client/Server Programm kommunizieren Java Basics - Anfänger-Themen 3
H java.lang.NoClassDefFoundError Run as>> Run on Server Java Basics - Anfänger-Themen 2
F String zu einem Server senden Java Basics - Anfänger-Themen 4
N Server Zeit zur lokalen Zeit setzen. Java Basics - Anfänger-Themen 0
J TCP MultiThreaded Server und Client - irgendwo ist der Fehler, aber ich find ihn nicht Java Basics - Anfänger-Themen 3
I ical - Datei auf Server ablegen und Kalender abbonieren Java Basics - Anfänger-Themen 0
T Eclipse - GlassFish Server!? Java Basics - Anfänger-Themen 1
I Java Server Faces mit Glassfish Webseite veröffentlichen Java Basics - Anfänger-Themen 4
M Input/Output tcp-Server mit statischer Parallelität Java Basics - Anfänger-Themen 7
G Multiple Clients and one Server Java Basics - Anfänger-Themen 2
K Java Client > Python Server Java Basics - Anfänger-Themen 0
F jabva 7.21 läuft nicht auf windows server 2012? Java Basics - Anfänger-Themen 9
D Socket ---> Server Socket worauf muss ich achten? Java Basics - Anfänger-Themen 2
S Java - Client/Server mit Stomp kurze Frage Java Basics - Anfänger-Themen 0
I JDK SERVER -jar stoppen Java Basics - Anfänger-Themen 5
Screen Wie Propertydatei im Server beschreiben? Java Basics - Anfänger-Themen 7
K threaded server Java Basics - Anfänger-Themen 18
E Client Server Java Basics - Anfänger-Themen 12
Q Datenbank nicht über separaten Server Java Basics - Anfänger-Themen 4
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
L Chat server Java Basics - Anfänger-Themen 4
O Server Client Problem Java Basics - Anfänger-Themen 2
B Java Server Side Java Basics - Anfänger-Themen 14
H Java Server/Client, HTML Seite anzeigen Java Basics - Anfänger-Themen 2
L Server pingt Client und fordert Info Java Basics - Anfänger-Themen 2
G JObjekte dynamisch vom Server erzeugen lassen Java Basics - Anfänger-Themen 4
A Server logs auslesen Java Basics - Anfänger-Themen 6
Z Threads, Server, GUI Java Basics - Anfänger-Themen 4
R Server/Client für Spiel Java Basics - Anfänger-Themen 2
M Java class auf Server starten Java Basics - Anfänger-Themen 5
U Java-Programm auf einem Server starten Java Basics - Anfänger-Themen 33
D Java Applet Dateien auf Server auslesen? Java Basics - Anfänger-Themen 8
X Applet - Client/Server Java Basics - Anfänger-Themen 2
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
N Methoden Test ob Server vorhanden ist Java Basics - Anfänger-Themen 4
S .Bat Server von .java Starten Java Basics - Anfänger-Themen 5
L Server mit mehreren Clients Java Basics - Anfänger-Themen 25
L Bild versenden über Client/Server Java Basics - Anfänger-Themen 10
S Klassen Server und Client Java Basics - Anfänger-Themen 3
M Client - DB-Server Struktur Java Basics - Anfänger-Themen 7
M daytime-Server Port 13 Java Basics - Anfänger-Themen 2
U Probleme mit Server-Client implementierung Java Basics - Anfänger-Themen 5
O (von Applet) daten an Server übergeben Java Basics - Anfänger-Themen 4
W mehrere clients auf einem server Java Basics - Anfänger-Themen 2
R Server-Daten sichern/verschlüsseln Java Basics - Anfänger-Themen 10
N Applets: Objekte vom Server laden Java Basics - Anfänger-Themen 4
G Server-Client Kommunikation Java Basics - Anfänger-Themen 3
V pfad.exists() gilt nicht für "//server/a/xyz.jpg"? Java Basics - Anfänger-Themen 12
F SQL Server aus Umlaute werden Fragezeichen Java Basics - Anfänger-Themen 4
S FTP Server Java Basics - Anfänger-Themen 3
P Application Server Java Basics - Anfänger-Themen 3
B Object an Server senden, Server antwortet mit objekt? Java Basics - Anfänger-Themen 7
C Bilder von Server zu Server kopieren über Webdav(Sardine) Java Basics - Anfänger-Themen 5
H Java-Server mit Browser ansprechen Java Basics - Anfänger-Themen 19
M Standard-Klassen auf Server nicht verfügbar Java Basics - Anfänger-Themen 7
Spin Server Location is not an Sun Java System Application Server 8.2 Java Basics - Anfänger-Themen 2
Dit_ Daten vom Server in einer Schleife Java Basics - Anfänger-Themen 4
S In Eclipse relativen Pfad fuer Tomcat Server erstellen..? Java Basics - Anfänger-Themen 3
M Verbindung zu einem Server über Eclipse Java Basics - Anfänger-Themen 6
0 Frage zu Architektur: Server eines kleines Spiels Java Basics - Anfänger-Themen 4
G Sessionüberprüfung funktioniert lokal aber nicht auf dem Server! Java Basics - Anfänger-Themen 12
S Chat-Server Java Basics - Anfänger-Themen 6
S Java Applet - Verbindung zum Eigenen Server Java Basics - Anfänger-Themen 2
Z Tomcat Server Kommunikation zu Client Applet Java Basics - Anfänger-Themen 5
M Socket Server Java Basics - Anfänger-Themen 9
M Problem: JSP für Zugriff auf Oracle-Server/Datenbank - sinnvoll? Java Basics - Anfänger-Themen 35
B Server-Client mit Thread ausstatten Java Basics - Anfänger-Themen 3
brainray Einfachen RMI Server bei einem Provider zum Laufen bringen Java Basics - Anfänger-Themen 3
brainray Server abbrechen mit CTRL-C Java Basics - Anfänger-Themen 2
H Server & Applet Java Basics - Anfänger-Themen 11
Tandibur Server führt "try-catch" nicht aus Java Basics - Anfänger-Themen 6
D Client-Server Problem Java Basics - Anfänger-Themen 2
J Netzwerkrprogammierung Client - Server Java Basics - Anfänger-Themen 3
J Netzwerkprogrammierung Client/Server Java Basics - Anfänger-Themen 16
G ArrayListe vom Server nach Client schicken Java Basics - Anfänger-Themen 17
M Server-Programm in Java (localhost) Java Basics - Anfänger-Themen 7
S j2ee-Server und JMS Java Basics - Anfänger-Themen 3
B String vom Server nach Position... (erledigt) Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben