Warum empfängt mein Stream keinen Input?

Status
Nicht offen für weitere Antworten.

lacyuu

Mitglied
Ich arbeite gerade an einer Art Chat-Programm dass auf dem Client-Server-Modell basiert.
Die Clients melden sich an, Passwort und Name werden überprüft und dann können die Clients Nachrichten an alle Clients senden oder eine Nachricht empfangen.

Wenn sich ein Client anmeldet, sendet er dem Server seine Userdateien, danach startet er einen Thread um Nachrichten zu empfangen, und geht dann in eine Schleife, in der er die Möglichkeit hat, Nachrichtern zu schreiben und abzuschicken. Wenn jetzt der Server z.B. eine nachricht schickt, dass der Client angemeldet ist, passiert nichts.
Beim Client kommt nichts an.
An der Serverseite kann's nicht liegen, dort hab ich alles gecheckt und der Output wird gesendet.

Hier erstmal der Code:


Der Client:
Java:
import java.io.*;
import java.net.*;


public class Client {

            public static void main(String[] args)throws IOException{

                
                anmeldung();
            }
    
            
    public static void anmeldung() throws IOException{

String Name;
String Passwort;

try{
          Socket csocket = new Socket("localhost",12345);       //Verbinden mit dem Server über Socket
    ObjectOutputStream send = new ObjectOutputStream (csocket.getOutputStream());
   BufferedReader in = new BufferedReader ( new InputStreamReader(System.in));

       System.out.print("Bitte Namen eingeben: ");        //Dateneingabe
       Name = in.readLine();



       System.out.print("Bitte Passwort eingeben: ");
       Passwort = in.readLine();

       User clientuser = new User(Name,Passwort);       //Anlegen einer UserKlasse
       Message msg = new Message("",clientuser);               //Anlegen einer default-Message

       send.writeObject(clientuser);        //User-Objekt wird verschickt
       send.flush();
       System.out.println("So, Paket ist raus!!");


    ThreadEmpfang empfang = new ThreadEmpfang(csocket);     //Starten der Threads die gleichzeitiges Senden und Empfangen von Nachrichten ermöglichen

    empfang.start();

    try{
while(true){
         System.out.print("Nachricht eingeben: ");
       message.nachrichtschreiben(in.readLine());
      send.writeObject(message);
      send.flush();
         }
        }catch(IOException e){System.err.print(e);}
    




}catch(IOException e){System.err.println(e);}

    }

}

und noch der Empfangsthread:

Java:
import java.net.*;
import java.io.*;
import java.util.*;

public class ThreadEmpfang extends Thread{

    Socket socket;
    Message nachricht;

    ThreadEmpfang(Socket socket){

            this.socket = socket;

    }

    @Override
    public void run(){
        try{   


            while(true){
                nachricht = new Message("");
              ObjectInputStream input= new ObjectInputStream(socket.getInputStream());
              nachricht = (Message)input.readObject();
              Darstellung(nachricht);
            }
        }catch(IOException e){}
        catch(ClassNotFoundException f){System.out.println("Falscher Datentyp.");}
    }

    public void Darstellung(Message message){
        if(message.absender==null){
            System.out.println("default: "+message.msg);
        }
        else{System.out.println(message.absender.name+" : "+message.msg);}
    }
}


Was noch zu erwähnen wäre:

Den Empfangsthread wie er da so steht, hab ich zum Testen in einem vereinfachten Client-ServerProgramm verwendet, dort hat der Client auch etwas empfangen! (aber glaube ich irgendwo anders dann blockiert)

Außerdem verwende ich nur ObjectStreams über die ich einerseits User Objekte(enthalten Userdaten) und Message Objekte(enthalten Nachricht und den absender User)


Habe ich also irgendwas irgendwo falsch gemacht? Oder könnte sich der Fehlerteufel an einer ganz anderne Stelle eingeschlichen haben, was immer wieder Probleme beim Senden/Empfangen verursacht?

Wodurch kommen solche Probleme immer wieder zustande?

Wäre echt lieb, wenn mir jemand weiterhelfen könnte (sogar mein Übungsleiter, ein Dipl.Inf. hat sich an meinem Problem die Zähne ausgebissen )

Danke an alle, die sich wenigstens die Mühe machen, mein Problem mal anzuschauen!

MfG,
lacyuu


(Diese Frage mit Quelltext hatte ich schon in nem anderen Forum gepostet, wo aber nicht so viel los ist)
 
Zuletzt bearbeitet:
S

SlaterB

Gast
wer ist denn der Server, steht der unter deiner Kontrolle?
du hast nichts von dem gepostet, vielleicht macht der gar nix,

-----

allgemein:
> nachricht = new Message("");
> ObjectInputStream input= new ObjectInputStream(socket.getInputStream());
> nachricht = (Message)input.readObject();

wieso unnötig eine leere Message erzeugen,
nachricht = null;
ginge genauso oder die Zeile komplett weglassen

> public void Darstellung(Message message){

nie Methoden oder Variablen groß schreiben

> while(true){
> System.out.print("Nachricht eingeben: ");
> message.nachrichtschreiben(in.readLine());
> send.writeObject(message);

ObjectOutputStreams können dazu neigen, einmal gesendete Objekte nicht nochmal zu senden,
oder nur einen Marker in den Stream zu legen 'das bekannte Objekt 5 hier nochmal',

immer neue Objekte reinschreiben oder
stream.reset() benutzen
 

lacyuu

Mitglied
Gut, dann also noch der Server:


Java:
import java.net.*;
import java.io.*;
import java.util.*;

public class Server {

                Vector clientliste;        //erstellen einer Liste, in der alle angemeldeten Clients registriert werden
            Message message;
            User serveruser;       //da Nachrichten sich über User identifizieren lassen, wird ein Serveruser für Systemmeldungen angelegt
            Message servermessage;
            Message serverbroadcast;       //Nachrichten, die an alle geschickt werden
            ServerSocket serversocket;

Server(){
                this.clientliste = new Vector();        //erstellen einer Liste, in der alle angemeldeten Clients registriert werden
            this.message = new Message("");
            this.serveruser = new User("Server Message", "");       //da Nachrichten sich über User identifizieren lassen, wird ein Serveruser für Systemmeldungen angelegt
            this.servermessage = new Message("Anmeldung erfolgreich, wilkommen auf dem Server. \n Sie können Nachrichten an andere User schreiben. (verlassen mit 'quit')", serveruser);     //Nachrichten, die an einzelnen User gehen
            this.serverbroadcast = new Message("", serveruser);       //Nachrichten, die an alle geschickt werden
        try {
            this.serversocket = new ServerSocket(12345);

        } catch (IOException e) {
            System.err.println(e);
}
}
    

    public void runsocket(Server server) throws IOException {
        try {

            System.out.println("Server is running...");

            while (true) {
                Socket ssocket = serversocket.accept();       //Server horcht Leitung ab
                    

                LoginThread thread = new LoginThread(ssocket,server);      //Thread für diesen Client wird angelegt
                thread.start();

            }
        } catch (IOException e) {
        }
    }

    public static void main(String[] args) {



        try {
            Server server = new Server();


            server.runsocket(server);
        } catch (IOException e) {
            System.err.println(e);
        }
    
    }}

der macht natürlich nicht viel, das erledigt der Thread LoginThread für ihn:

Java:
import java.net.*;
import java.io.*;
import java.util.*;

public class LoginThread extends Thread {

    Socket socket;
    User user;
    Server server;

    LoginThread(Socket socket,Server server) {

        this.socket = socket;
        this.user = null;
        this.server = server;

    }

    public boolean login() {       //Methode, die den eingehender User mit den bereits vorhandenen Usern vergleicht und Passwörter überprüft
        try {
            ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
            ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
            PrintWriter out = new PrintWriter(output);


            user = (User) input.readObject();
            User usercheck = new User();
            user.printUser();
            boolean check = false;;


            if (server.clientliste.isEmpty()) {      //Bisher noch kein Client angemeldet
                check = true;
            }
            else{
            for (int i = 0; i < server.clientliste.size()&&check==true; i++) {       //schrittweise überprüfen der liste nach keys
                usercheck = ((LoginThread) server.clientliste.get(i)).user;
                if (user.name.equals(usercheck.name)) {       //überprüfen ob Name schon vorhanden ist
                    if (user.passwort.equals(usercheck.passwort)) {   //Prüfen, ob passwort übereinstimmt

                      check = true;
                    } else {
                        out.println("User " + user.name + " existiert bereits. Passwort für User " + user.name + " ist falsch. Geben Sie das korrekte Passwort ein oder melden Sie sich mit einem anderen Namen an.");
                       
                    }
                } else {
    }
                }
            
            check = true;}
            //Name existiert noch nicht

return check;


        } catch (IOException e) {
        } catch (ClassNotFoundException f) {
            System.out.println("Datenpaket hatte das falsche Format.");
        }
        return true;
    }

    @Override
    public void run() {       

        boolean check = false;
        boolean close = false;
        
                try {
            ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
            ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
            PrintWriter out = new PrintWriter(output);


            user = (User) input.readObject();
            User usercheck = new User();
            user.printUser();



            if (server.clientliste.isEmpty()) {      //Bisher noch kein Client angemeldet
                check = true;
            }
            else{
            for (int i = 0; i < server.clientliste.size()&&check==false; i++) {       //schrittweise überprüfen der liste nach keys
                usercheck = ((LoginThread) server.clientliste.get(i)).user;
                if (user.name.equals(usercheck.name)) {       //überprüfen ob Name schon vorhanden ist
                    if (user.passwort.equals(usercheck.passwort)) {   //Prüfen, ob passwort übereinstimmt

                      check = true;
                    } else {
                        out.println("User " + user.name + " existiert bereits. Passwort für User " + user.name + " ist falsch. Geben Sie das korrekte Passwort ein oder melden Sie sich mit einem anderen Namen an.");
                        check = false;
                    }
                } else {
    }
                }
            check = true;}
            //Name existiert noch nicht

                }catch(IOException e){}
                    catch(ClassNotFoundException f){}
     if(check){   
         Message nachricht = new Message("",user);
         send(server.servermessage);
         for(int i=0;i<server.clientliste.size();i++){
             nachricht.nachrichtschreiben(((LoginThread)server.clientliste.elementAt(i)).user.name);
             send(nachricht);
         }
        try {
            ObjectInputStream input = new ObjectInputStream(socket.getInputStream());

                        while(!close){
            nachricht = (Message) input.readObject();
            System.out.println(nachricht.msg);

            
            sendall(nachricht);
            
            
            }
        } catch (IOException e) {
        } catch (ClassNotFoundException f) {
            System.out.println("Datenpaket hatte das falsche Format.");
        }
        
    }
                
    }

    public void send(Message nachricht) {        //Methode zum Senden von Nachrichten an einen Clienten
        try {
            System.out.println("Bereit zum Senden!!");
                        System.out.println(nachricht.msg);
            ObjectOutputStream paketsenden = new ObjectOutputStream(socket.getOutputStream());

            paketsenden.writeObject(nachricht);
            paketsenden.flush();
            System.out.println("Paket ist raus");
        } catch (IOException e) {
        }
    }
    public void sendall(Message nachricht){
        
                 
                            for (int i = 0; i < server.clientliste.size(); i++) {        //Nachricht wird an alle angemeldetes Clients verschickt
                        ((LoginThread) server.clientliste.elementAt(i)).send(nachricht);
                    }
    }
}

Ist noch nicht alles ganz fertig, was die Funktionen betrifft, aber bevor man mit etwas arbeiten kann, muss ja erstmal der Datenstrom funktionieren.
 
S

SlaterB

Gast
du solltest auf jeder Seite maximal genau einen ObjectInputStream/ OutputStream auf die Socket-Streams legen,
nicht teilweise pro Nachricht neu..,

jeder ObjectOutputStream schreibt neben seinen Objekten auch noch spezielle Markierungen wie 'Begin der Datei' usw.,
das mehrmals durcheinander endet nur im Chaos,

PrintWriter über ObjectOutputputStream ist auch ausgeschlossen,
wenn ObjectOutputStream, dann sende dort Strings als Objekte

----
tausende Untermethoden, Listen von Nachrichten usw. machen alles unnötig kompliziert,
übe ersteinmal, eine einfache Kommunikation aufzubauen, der Server sollte z.B. nichts weiter tun, als die empfangenen Objekte zurückzusenden, vielleicht noch erweitert um die Info 'habe ich gelesen'
 

lacyuu

Mitglied
Okay, ich habe die Streams auf jeder Seite radikal auf jeweils zwei (Input/Output) reduziert und endlich kommt was beim Client an.
Jetz hapert's nur noch an dem Verschicken an die anderen User, aber ich glaube, die Lösung dafür liegt darin, endlich Ordnung im Programm zu machen.

Ich weiß selbst, dass mein Programmtext ziemlich undurchsichtig ist, das liegt aber daran, dass ich dieses Programm ziemlich bald vorstellen muss, und wenn schon nichts läuft, soll man wenigstens mein Vorgehen im Programmtext nachverfolgen können. ;)

Vielen Dank auf jeden Fall für die vielen Ratschläge.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1
Seikuassi Socket CipherInput/OutputStream empfängt nichts Netzwerkprogrammierung 23
D UDP Client empfängt nichts Netzwerkprogrammierung 2
L Socket Client empfängt nicht Netzwerkprogrammierung 6
P Socket Client empfängt nur eigene Text-Eingaben Netzwerkprogrammierung 30
I Chat-Client empfängt nichts vom Server Netzwerkprogrammierung 3
G TCP server empfängt falsche Werte !?!? Netzwerkprogrammierung 2
I Socket empfängt null Netzwerkprogrammierung 3
Messoras Launcher für mein Spiel Netzwerkprogrammierung 7
M Wo ist mein Fehler ? o: Netzwerkprogrammierung 4
C Über welchen Netzwerkadapter kommt mein receive? Netzwerkprogrammierung 15
P Warum lässt sich mein Server und mein Client einfach nicht schließen?!?! Netzwerkprogrammierung 16
T Wieso ist mein Objekt leer? Netzwerkprogrammierung 6
G server für mein spiel. Netzwerkprogrammierung 5
A mein Code compiliert nicht! Netzwerkprogrammierung 2
R Mein FileTransfer Programm Netzwerkprogrammierung 12
T Proxy will einfach nicht mein prog akzeptieren Netzwerkprogrammierung 3
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
E Socket Werte mit DataInput- und Output- Stream übergeben Netzwerkprogrammierung 1
T MP3 Dateien Stream Netzwerkprogrammierung 3
C Byte Stream dekodieren Netzwerkprogrammierung 7
G Video aus RTSP Stream speichern Netzwerkprogrammierung 8
B Socket BufferedReader.readLine() beenden ohne den Stream zu closen Netzwerkprogrammierung 7
A versch. Daten im Stream erkennen Netzwerkprogrammierung 2
E stream speichern Netzwerkprogrammierung 5
S Dateitransfer - kein end of stream Netzwerkprogrammierung 5
M RTP Stream überprüfen... Netzwerkprogrammierung 4
K ein Thread pro Stream Netzwerkprogrammierung 2
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
B Pdf Stream von Servlet mit itext Netzwerkprogrammierung 12
K End of stream, BufferedInputStream Netzwerkprogrammierung 4
A Icecast / SHOUTcast MP3 Stream / icy-metaint Netzwerkprogrammierung 3
Kr0e Simpler HTTP Stream server Test Netzwerkprogrammierung 3
H String Array durch einen Stream schicken. Netzwerkprogrammierung 4
lordcarlos Erstes TCP programm - output stream problem Netzwerkprogrammierung 2
dayaftereh Bester Stream für ein Spiel? Netzwerkprogrammierung 15
N Socket Stream Schicken Netzwerkprogrammierung 13
N Socket Stream in String Netzwerkprogrammierung 4
M Bytes aus Stream lesen Netzwerkprogrammierung 3
J byte[] auf Stream schreiben Netzwerkprogrammierung 2
M ich habe ein stream problem Netzwerkprogrammierung 7
S Schnellster Stream Netzwerkprogrammierung 20
V Mehrere Streams durch einen Stream senden Netzwerkprogrammierung 14
W Was für ein Stream soll ich verwenden? Netzwerkprogrammierung 8
F Stream wird als Char übertragen. Char -> in String umwand Netzwerkprogrammierung 5
A java.io.StreamCorruptedException: invalid stream header Netzwerkprogrammierung 2
C invalid stream header Netzwerkprogrammierung 2
T Stream de-multiplexen Netzwerkprogrammierung 2
J gzip Stream weiterleiten Netzwerkprogrammierung 3
m@nu Ende von Stream bei HTTP-Request Netzwerkprogrammierung 3
C Problem mit Object-Stream Netzwerkprogrammierung 3
N TCP Stream auslesen Netzwerkprogrammierung 7
André B. Stream Bridge? Netzwerkprogrammierung 2
P Verschiedene Daten über einen Stream Netzwerkprogrammierung 4
T Musik-Stream: Server sendet die Datei zu schnell ? Netzwerkprogrammierung 3
N InternetRadio-Stream umleiten Netzwerkprogrammierung 2
G Writer oder Stream bei Socket? Netzwerkprogrammierung 2
G Datei über HTTP Stream senden Netzwerkprogrammierung 4

Ähnliche Java Themen


Oben