Hilfe beim Chat Programm

wwwmarc

Mitglied
Hallo, ich versuche mich gerade daran ein kleines, einfaches Chat-Programm auf die Beine zu stellen. Das Problem liegt bei der Netzwerkverbindung, bzw beim lesen vom BufferedReader. Wenn ich einen neuen Thread für einen Clienten starte, stürzt das Programm sofort ab. Ich vermute das der Fehler irgendwo in der Thread-Klasse liegt, wenn er versucht etwas zu lesen. Bin leider noch Anfänger.

Ich hoffe das mir jemand helfen kann

Thread-Klasse:

Code:
package pack;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;

public class ClientThread extends Thread {
    Socket socket= null;
    BufferedReader in = null;
    PrintWriter out = null;
    
    ClientThread(Socket socket)  {
        this.socket = socket;
    }
    
    public void run()  {
        try {
            out = new PrintWriter(this.socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            
            String input = null;
            
            while((input = in.readLine()) != null)   {
                
            }
            
            out.close();
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    

}

Client-Klasse:
Java:
package pack;

import java.net.Socket;

public class Client {
    public static void main(String[] args)  {
        Socket socket;
        try  {
            socket = new Socket("localhost", 5555);
        } catch(Exception e)  {
            e.printStackTrace();
        }
    }
    
    

}

Server Klasse:

Java:
package pack;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server {
    ServerSocket server;
    Socket socket;
    ArrayList<PrintWriter> writer;
    ArrayList<InputStreamReader> reader;
    ArrayList<Integer> port;
    PrintWriter out = null;
    InputStreamReader in = null;
    
    
    public void starteServer()  {
        try  {
            server = new ServerSocket(5555);
            System.err.println("Server gestartet und wartet auf Verbindung...");
        } catch (Exception e)  {
            e.printStackTrace();
        }
    }
    
    public void warteAufAnfrage()  {
        while(true)  {
            try {
                socket = server.accept();
                out = new PrintWriter(socket.getOutputStream());
                in = new InputStreamReader(socket.getInputStream());
                writer.add(out);
                //reader.add(in);
                //port.add((Integer) socket.getPort());
                System.err.println("Verbindung mit dem Port: " + socket.getPort() + " war erfolgreich!");
                
                Thread t = new Thread(new ClientThread(socket));
                t.start();
                
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args)  {
        Server server1 = new Server();
        server1.writer = new ArrayList<PrintWriter>();
        server1.reader = new ArrayList<InputStreamReader>();
        server1.port = new ArrayList<Integer>();
        server1.starteServer();
        server1.warteAufAnfrage();

    }

}
 

fhoffmann

Top Contributor
Du erzeugst sowohl in der Server-Klasse als auch in der Thread-Klasse einen Writer bzw. Reader mit den Streams des Sockets. Das kann nicht gut gehen!
 
K

kneitzel

Gast
Also neben dem Hinweis von @fhoffmann würde ich Dir auch den Tipp geben, Dir doch einmal die SocketChannel anzusehen statt der Sockets.

Sockets sind synchron aber solche IO Geschichten werden eigentlich schon länger asynchron gemacht und dafür wurde damals auch das Framework von Java erweitert mit dem Namespace java.nio.

Die folgende Seite erläutert das relativ gut incl. der Vorteile:
https://examples.javacodegeeks.com/core-java/nio/java-nio-socket-example/

Mit den besten Grüßen,

Konrad
 

wwwmarc

Mitglied
Erst mal vielen Dank für die Hinweise...

Die Fehlermeldung sieht folgendermaßen aus. Vielleicht kommt so jemand auf das Problem. Auch wenn nur im Thread einmalig ein Writer und ein Reader erzeugt werden erscheint die selbe Fehlermeldung.

java.net.SocketException: Connection reset
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:186)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.base/java.io.InputStreamReader.read(InputStreamReader.java:185)
at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
at pack.ClientThread.run(ClientThread.java:27)
at java.base/java.lang.Thread.run(Thread.java:835)
 
K

kneitzel

Gast
Wie öffnest Du denn die Verbindung mit dem Client? Die Meldung besagt einfach, dass die Verbindung geschlossen wurde. Wenn also der Client die Verbindung aufbaut und dann wieder schließt, dann würde dies das Verhalten erklären.
 

wwwmarc

Mitglied
Wie kann ich denn dafür sorgen, dass die Verbindung bestehen bleibt. Die Verbindungen sind doch eigentlich Writer und Reader oder nicht? Eigentlich schließe ich diese Verbindungen nirgendwo, sondern möchte die im Thread aufbauen, den ich ja starte, sobald der Client eine Anfrage an den Server geschickt hat?

Ich glaube ich verstehe da gerade irgendwie ein bisschen was falsch. Wie kann ich eine dauerhafte Verbindung zum Clienten halten, ohne das diese geschlossen wird? Vielleicht kannst du mir da auch weiter helfen?
 
K

kneitzel

Gast
Du hast eine Client Software, die eine Verbindung zum Server aufbaut. Also Ablauf ist erst einmal:
- Server erstellt einen TCP/IP Socket, der auf einem Port hört.
- Client startet die Verbindungsaufnahme zu dem Server / Port
- Dieser Verbindungsaufbau bekommt der Socket beim Server mit und kann dann angenommen werden.
==> Handshake zur Verbindungsaufnahme endet dann, Client und Server haben eine aktive Verbindung per TCP/IP.

In dem Status können Client und Server sich gegenseitig Nachrichten senden. Bedeutet aber, dass beide Seiten aktiv sind. Eine Verbindung auf tcp Basis bedeutet, dass da im Hintergrund, ohne dass Du als Entwickler etwas davon mitbekommst, Nachrichten austauschen. Der ganze Handshake läuft halt automatisch. Und da steckt einiges mehr dahinter, so werden die Daten, die du versendest, in kleine Pakete zerteilt und dann versendet. Alle Teile kommen in einen Umschlag und noch ganz viele andere Dinge.

Aber das sind dann Details, die man nicht zu genau wissen muss. Wichtig ist, dass es ein aktives Verbindungsende beim Client und beim Server gibt. Sollte Dich das aber im Detail interessieren, dann ist evtl. https://de.wikipedia.org/wiki/Transmission_Control_Protocol interessant für Dich. Da wird das dann auch etwas exakter und tiefer erläutert.

Aber um es kurz zu machen: Wie sieht denn der Client bei Dir aus?
 

wwwmarc

Mitglied
Du hast eine Client Software, die eine Verbindung zum Server aufbaut. Also Ablauf ist erst einmal:
- Server erstellt einen TCP/IP Socket, der auf einem Port hört.
- Client startet die Verbindungsaufnahme zu dem Server / Port
- Dieser Verbindungsaufbau bekommt der Socket beim Server mit und kann dann angenommen werden.
==> Handshake zur Verbindungsaufnahme endet dann, Client und Server haben eine aktive Verbindung per TCP/IP.

In dem Status können Client und Server sich gegenseitig Nachrichten senden. Bedeutet aber, dass beide Seiten aktiv sind. Eine Verbindung auf tcp Basis bedeutet, dass da im Hintergrund, ohne dass Du als Entwickler etwas davon mitbekommst, Nachrichten austauschen. Der ganze Handshake läuft halt automatisch. Und da steckt einiges mehr dahinter, so werden die Daten, die du versendest, in kleine Pakete zerteilt und dann versendet. Alle Teile kommen in einen Umschlag und noch ganz viele andere Dinge.

Aber das sind dann Details, die man nicht zu genau wissen muss. Wichtig ist, dass es ein aktives Verbindungsende beim Client und beim Server gibt. Sollte Dich das aber im Detail interessieren, dann ist evtl. https://de.wikipedia.org/wiki/Transmission_Control_Protocol interessant für Dich. Da wird das dann auch etwas exakter und tiefer erläutert.

Aber um es kurz zu machen: Wie sieht denn der Client bei Dir aus?

Wow, vielen Dank. Da ist jemand nicht erst seit gestern dabei :D

Die Client-Klasse sieht bisher folgendermaßen aus:

Code:
package pack;

import java.net.Socket;

public class Client {
    public static void main(String[] args)  {
        Socket socket;
        try  {
            socket = new Socket("localhost", 5555);
        } catch(Exception e)  {
            e.printStackTrace();
        }
    }
    
    

}

Und die Client-Thread Klasse:

Code:
package pack;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Timer;
import java.util.TimerTask;

public class ClientThread implements Runnable {
    Socket socket;
    BufferedReader in;
    PrintWriter out;
    
    ClientThread(Socket socket)  {
        try {
            this.socket = socket;
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    
    public void run()  {
        try {
            String input;
            while((input = in.readLine()) != null)  {
                
            }
            //this.socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    

}

Ich weiß, der Code ist ziemlich Katastrophal...
 

fhoffmann

Top Contributor
In der Klasse Client wird eine Verbindung zum Server erzeugt und dann das Programm sofort beendet. Durch das Beenden des Programms wird die Verbindung wieder geschlossen. Der Server merkt das und wirft die Exception.
 
K

kneitzel

Gast
Erweitere den Client einmal so, dass er da dem Server erst einmal paar Dinge schickt. (Also den Writer geben lassen und was reinschreiben. Von mir aus ein "Hallo Server!".)
Danach liest Du etwas vom Server und gibst es aus.

Danach kann sich das Programm dann gerne beenden.

Auf Serverseite liest Du in der Schleife, das der Client Dir gesendet hat und du gibst dann auch irgendwas zurück.
 

wwwmarc

Mitglied
Erweitere den Client einmal so, dass er da dem Server erst einmal paar Dinge schickt. (Also den Writer geben lassen und was reinschreiben. Von mir aus ein "Hallo Server!".)
Danach liest Du etwas vom Server und gibst es aus.

Danach kann sich das Programm dann gerne beenden.

Auf Serverseite liest Du in der Schleife, das der Client Dir gesendet hat und du gibst dann auch irgendwas zurück.

Also den Client-Thread quasi komplett weg und nur mit diesen beiden Klassen arbeiten? Verstehe ich das richtig?
 
K

kneitzel

Gast
ClientThread ist im Server ja ein Thread, der den Client behandelt. So lange nur einzelne Clients sich verbinden, ist dies prinzipiell ok, aber nicht sehr performant. Das würde ich aber erst einmal so lassen so du mit den Sockets weiter machen möchtest.

Hier geht es erst einmal um die Client Klasse. Du öffnest den Socket und machst da noch nichts mit. Da solltest Du Dir den output stream nehmen und was schreiben. Und dann den input Stream und was lesen:
Java:
public class Client {
    public static void main(String[] args)  {
        try  {
            Socket socket = new Socket("localhost", 5555);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream());
            out.println("Hallo");
            System.out.println(in.readLine());
        } catch(Exception e)  {
            e.printStackTrace();
        }
    }
}

ClientThread kannst Du aber auch gleich ändern:
Java:
    public void run()  {
        try {
            String input;
            while((input = in.readLine()) != null)  {
                out.writeLine("received: ''" + input + "'""'");
            }
            //this.socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Nun wirst Du auch weiterhin die Exception bekommen, denn sobald der Server den Text zurück gesendet hat, wird der Client sich wieder beenden und die Verbindung wird geschlossen. Hier musst Du also die Exception noch abfangen um dann den Thread zu beenden und den Client, so Du da irgendwas gespeichert hast, den aus den Listen heraus nehmen.
Aber mir geht es darum, dass Du etwas siehst. Der Client sollte also jetzt "Hallo" an den Server senden und dann "received: 'Hallo'" zurück bekommen.
 

wwwmarc

Mitglied
Okay, vielen Dank erst mal für die Hilfe. Ich denke ich muss mir doch noch etwas Lektüre beschaffen um damit weiterführend arbeiten zu können
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Brauche Hilfe beim fertigstellen eines Chat programms Java Basics - Anfänger-Themen 8
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
A Hilfe beim Lesen von Pfaden und Systemvariablen Java Basics - Anfänger-Themen 3
X Hilfe beim Übertragen in eine For-Schleife Java Basics - Anfänger-Themen 1
C Brauche Hilfe beim Schreiben eines Programmes :/ Java Basics - Anfänger-Themen 1
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
pry bitte Hilfe beim Kreditrechner objektorientiert Java Basics - Anfänger-Themen 6
J Hilfe beim Label animieren Java Basics - Anfänger-Themen 1
J Hilfe beim verstehen Java Basics - Anfänger-Themen 3
L Anfänger braucht Hilfe - Stecke beim Lernen fest Java Basics - Anfänger-Themen 10
Bluedaishi Hilfe beim erklären dieser Methode Java Basics - Anfänger-Themen 5
J Hilfe beim Programmieren Java Basics - Anfänger-Themen 5
L Brauche Hilfe beim arbeiten mit Konstruktoren Java Basics - Anfänger-Themen 20
L Kleine Hilfe beim Schreiben eines Programmes benötigt :D Java Basics - Anfänger-Themen 40
S Erste Schritte Hilfe beim lernen von Programmieren Java Basics - Anfänger-Themen 2
der_Schokomuffin Hilfe gesucht beim Thema Objekte übergeben! Java Basics - Anfänger-Themen 2
J Hilfe beim Runden Java Basics - Anfänger-Themen 4
F (Eclipse) Beim importieren etwas fehlerhaft bitte um Hilfe :) Java Basics - Anfänger-Themen 3
V Erste Schritte Hilfe gesucht beim einstieg in Java und erste Aufgaben aus der Berufsschule Java Basics - Anfänger-Themen 9
S Compiler-Fehler Anfänger sucht Hilfe. Fehler beim Compilieren Java Basics - Anfänger-Themen 6
I Hilfe beim löschen von Buchstaben. Java Basics - Anfänger-Themen 1
I Hilfe beim löschen schon Buchstaben. Java Basics - Anfänger-Themen 4
J Hilfe beim "Verknüpfen" von zwei Klasse Java Basics - Anfänger-Themen 15
B Hilfe beim Kreisberechnungsprogramm Java Basics - Anfänger-Themen 6
D Hilfe beim übersetzen in der Klasse Throwable Java Basics - Anfänger-Themen 2
S Datentypen Hilfe beim Typecasting Java Basics - Anfänger-Themen 7
F Erste Schritte Hilfe beim Algorithmus finden Java Basics - Anfänger-Themen 8
H Hilfe beim Programmablaufplan Java Basics - Anfänger-Themen 2
C Hilfe beim Zeichnen Java Basics - Anfänger-Themen 8
P Hilfe beim einlesen eines Textes Java Basics - Anfänger-Themen 11
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
D Hilfe beim SDF Datum Ausgabe Java Basics - Anfänger-Themen 20
S brauche hilfe beim fehler finden Java Basics - Anfänger-Themen 2
B Co2 rechner hilfe beim programmieren Java Basics - Anfänger-Themen 10
D Hilfe beim einlesen eines Strings mit Leerzeichen Java Basics - Anfänger-Themen 16
C Brauche dringend hilfe beim exception im code Java Basics - Anfänger-Themen 5
E Hilfe beim Einstieg Java Basics - Anfänger-Themen 46
T brauche HILFE beim Junit test:eek: Java Basics - Anfänger-Themen 11
P HILFE !!! erste aufgabe beim programmieren Java Basics - Anfänger-Themen 13
S Bisschen hilfe beim Sudoku Lösen benötigt Java Basics - Anfänger-Themen 7
V Hilfe beim implementieren von Iterator Java Basics - Anfänger-Themen 5
Y Brauche Hilfe beim Programm Java Basics - Anfänger-Themen 83
Developer_X Hilfe beim umbauen von Strings Java Basics - Anfänger-Themen 4
S Bitte um Hilfe beim unsortierten Binärbaum!! Java Basics - Anfänger-Themen 6
M Brauche Hilfe beim Verstehen vom Quellcode Java Basics - Anfänger-Themen 4
G Fehler beim Ausführen HILFE! Java Basics - Anfänger-Themen 12
V Brauche Hilfe beim Programmieren Java Basics - Anfänger-Themen 3
V Brauche Hilfe beim Programmieren Java Basics - Anfänger-Themen 9
A Hilfe beim "übersetzen" Java Basics - Anfänger-Themen 7
O Linux - Fehler beim kompilieren - HILFE Java Basics - Anfänger-Themen 4
S brauche hilfe beim dateien kopieren / bearbeiten Java Basics - Anfänger-Themen 3
E brauche hilfe beim KeyListener Java Basics - Anfänger-Themen 4
S Hilfe beim Einlesen Java Basics - Anfänger-Themen 6
K Hilfe beim starten eines Programms! Bitte helfen. Java Basics - Anfänger-Themen 8
D Hilfe beim Übergeben vom JTextfield Java Basics - Anfänger-Themen 2
E hilfe beim code Java Basics - Anfänger-Themen 3
I Hilfe beim Java-Applet Beispiel Java Basics - Anfänger-Themen 27
G Hilfe zur einer Aufgabe: Datumsüberprüfung beim Gregorianis Java Basics - Anfänger-Themen 2
K Brauche Hilfe beim Programmieren eines Funktionsplotters Java Basics - Anfänger-Themen 3
B Hilfe beim Schüler-Project Java Basics - Anfänger-Themen 4
G Hilfe beim addieren(Anfänger) Java Basics - Anfänger-Themen 12
F Hilfe beim Zeichnen in JPanel Java Basics - Anfänger-Themen 2
L Kompletter Neuling: Hilfe beim ersten Java Versuchen Java Basics - Anfänger-Themen 12
F Hilfe beim erstellen von Jar files! Java Basics - Anfänger-Themen 2
A Hilfe beim Java-Einstieg Java Basics - Anfänger-Themen 3
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
E Hilfe bei rekursiver Funktion Java Basics - Anfänger-Themen 3
H pdf stempel - Hilfe erbeten Java Basics - Anfänger-Themen 6
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
F RegEx Hilfe Java Basics - Anfänger-Themen 5
S Hilfe bei Endlosschleife Java Basics - Anfänger-Themen 2
S Hilfe bei Praktischen Aufgaben von Arrays Java Basics - Anfänger-Themen 39
U Ich bräuchte Hilfe Java Basics - Anfänger-Themen 1
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10
Justin4687 Benötige Hilfe bei folgender Aufgabe Java Basics - Anfänger-Themen 2
aero043 Hilfe bei BlueJ Hausübung Java Basics - Anfänger-Themen 27
S Hilfe zu einer Aufgabe Java Basics - Anfänger-Themen 5
P Hilfe gesucht Java Basics - Anfänger-Themen 11
D Hilfe bei Calculator Test Java Basics - Anfänger-Themen 15
R Hilfe bei Aufgabe Java Basics - Anfänger-Themen 4
Zentriks Hilfe zu Sieb des Eratosthenes ohne boolean Java Basics - Anfänger-Themen 5
R Java Bücher hilfe Java Basics - Anfänger-Themen 9
U HILFE! - per ActionListener Felder enablen....... Java Basics - Anfänger-Themen 5
I Scheduling: "Quartz" verwenden, Hilfe bei Umstellung Java Basics - Anfänger-Themen 3
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
Ekooekoo Hilfe spiel Java Basics - Anfänger-Themen 5
SpiritsHuner Hilfe!! Java Basics - Anfänger-Themen 16
Lacotto Java Kurs Aufgaben Hilfe Java Basics - Anfänger-Themen 14
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
M HILFE JPanel - Graphics Java Basics - Anfänger-Themen 1
D Hilfe bei einer Aufgabe mit for-Schleife Java Basics - Anfänger-Themen 6
Neuling47 Denkfehler? Hilfe Java Basics - Anfänger-Themen 11
S Hilfe bei Umänderung von Java Code Java Basics - Anfänger-Themen 16
Robert_Klaus Hamster java Simulation Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
X Erste Schritte Hilfe bei einem kleinen Spiel. Java Basics - Anfänger-Themen 19
D Bitte um Hilfe muss es schnellstmöglich erledigen Java Basics - Anfänger-Themen 15
L Hilfe bei RegEx Java Basics - Anfänger-Themen 4
I Bitte um Hilfe zu unterstehenden Code Java Basics - Anfänger-Themen 6
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben