Hilfe beim Chat Programm

W

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

    }

}
 
F

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
 
W

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.
 
W

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?
 
W

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...
 
F

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.
 
W

wwwmarc

Mitglied
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.

Okay, soweit nachvollziehbar. Danke schon mal. Nur wie kann ich dafür sorgen, dass die Verbindung erhalten bleibt?
 
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.
 
W

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.
 
W

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
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 6
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
marcooooo einmal noch schnell hilfe bitte:/ Java Basics - Anfänger-Themen 2
Q Hilfe bei Hausaufgeben Java Basics - Anfänger-Themen 2
S Hilfe Java Basics - Anfänger-Themen 1
JD_1998 Random Array sortieren mit Hilfe einer Methode Java Basics - Anfänger-Themen 4
K Hilfe bei Methoden Übung Java Basics - Anfänger-Themen 6
Chabub Hilfe bei Stacks und Queue Java Basics - Anfänger-Themen 2
A Hilfe bei Java Projekt Java Basics - Anfänger-Themen 4
I Brauche Hilfe bei Objektorientiertem programmieren Java Basics - Anfänger-Themen 23
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
M Brauche Hilfe bei If-Scheifen Java Basics - Anfänger-Themen 2
M Hilfe bei Strukturierung eines Buchungssystems Java Basics - Anfänger-Themen 3
J Replace mit Hilfe von ArrayLists Java Basics - Anfänger-Themen 6
J Hilfe bei Übungsaufgabe Java Basics - Anfänger-Themen 17
K Error bei meinem Programm - Hilfe Java Basics - Anfänger-Themen 8
B Hilfe bei einer rekursiven Methode Java Basics - Anfänger-Themen 3
K Java Projekt Hilfe Java Basics - Anfänger-Themen 5
F ich brauche Hilfe bei Listen Java Basics - Anfänger-Themen 13
A suche dringend Hilfe!! Java Basics - Anfänger-Themen 6
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
L hilfe run button funktioniert nicht Java Basics - Anfänger-Themen 13
S Hilfe : Unendlich viele Zufallszahlen erstellen? Java Basics - Anfänger-Themen 8
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
E Ich Brauche Hilfe Java Basics - Anfänger-Themen 3
F Hilfe - Wahrheitswert überprüfen ohne If Java Basics - Anfänger-Themen 2
M Hilfe bei Testfällen. Java Basics - Anfänger-Themen 12
I Methoden char Array Aufgabe (bitte hierbei um Hilfe) Java Basics - Anfänger-Themen 3
J Brauche Hilfe bei einer aufgabe Java Basics - Anfänger-Themen 1
A Hilfe, LinkedList Java Basics - Anfänger-Themen 2
F Hilfe für einen Anfänger! Java Basics - Anfänger-Themen 4
F Regex Hilfe Java Basics - Anfänger-Themen 3
ZH1896ZH OOP Verstehe nicht was der Hinweis bedeutet, bitte um Hilfe! Java Basics - Anfänger-Themen 2
S Ein Java Anfänger braucht Hilfe Java Basics - Anfänger-Themen 5
S Hilfe bei meinem Code [Schleife]? Java Basics - Anfänger-Themen 5
S Brauche hilfe in Java [Fehler in mein Code]? Java Basics - Anfänger-Themen 2
S Wie ende ich mein Pogrammierung? [Hilfe] Java Basics - Anfänger-Themen 1
S Unbedingte hilfe bei Java Aufgabe [Schleife / Zinsrechnung] Java Basics - Anfänger-Themen 14
I Dezimalzahlen - Hilfe Java Basics - Anfänger-Themen 2
J Hilfe bei Java Aufgabe (Restschuld berechnen) Java Basics - Anfänger-Themen 11
S Hilfe bei Java Aufgabe (Schleifen) Java Basics - Anfänger-Themen 25
S Ein- Ausgaben Java [Hilfe] Java Basics - Anfänger-Themen 3
P Hilfe bei Double Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Anzeige

Neue Themen


Oben