Nachricht über Sockets kommt nicht an

Status
Nicht offen für weitere Antworten.
B

Big Al

Gast
Hi,
ich habe gerade angefangen, mich mit Java zu beschäftigen. Da ich von C# komme, wollte ich mal einen alten Netzwerkchat nach Java übertragen. Nur Kommt aus einem mir leider nicht ersichtlichen Grund die Nachricht am Ende des Streams nicht raus. Am besten ich poste mal meinen Code.
Das hier ist der Code, der im Server in einem Thread den Stream liest:
(Client ist der Socket, outStack der Stack mit den Nachrichten, die raus sollen)

Code:
            java.io.InputStream in;
            java.io.OutputStream out;
            java.io.BufferedReader reader;
            java.io.BufferedWriter writer;

            in = Client.getInputStream();
            out = Client.getOutputStream();
            writer = new BufferedWriter(new java.io.OutputStreamWriter(out));
            reader = new java.io.BufferedReader(new java.io.InputStreamReader(in));

            while (!stopRequested) {
                while (in.available() > 0)
                {
                    observer.HandleInputMessage(reader.readLine());
                }
            while (!outStack.empty()) {
                    writer.write(outStack.pop());

                try {
                    java.lang.Thread.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(RemoteClientHandler.class.getName()).log(Level.SEVERE, null, ex);
                }

                }
            }
            in.close();
            out.close();

Hier zeigt in.available() leider immer das Ergebnis 0.
Hier der Code, der im Client läuft:
Code:
            java.io.BufferedReader reader = null;
            java.io.BufferedWriter writer = null;
            try {
                reader = new java.io.BufferedReader(new java.io.InputStreamReader(Client.getInputStream()));
                writer = new java.io.BufferedWriter(new java.io.OutputStreamWriter(Client.getOutputStream()));
                
                while(!stopRequested)
                {
                    while(reader.ready())
                    {
                        String msg = reader.readLine();
                        if(observer != null)
                            observer.HandleInputMessage(msg);
                    }
                    while(!outStack.empty())
                    {
                        writer.write(outStack.pop());
                    }
                    try {
                        java.lang.Thread.sleep(100);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                
            } catch (IOException ex) {
                Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    reader.close();
                    writer.close();
                } catch (IOException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
Wenn ich debugge und einen Breakpoint auf writer.write(outStack.pop()); setze wird der auch ausgelöst, die Nachricht müsste also rausgehen.
Wäre schön wenn mich jemand aufklären würde, was man da in Java anders machen muss.
Vielen Dank,
Alexander
 

FArt

Top Contributor
Könnte sein, dass der Puffer deines BufferedWriters noch nicht voll genug ist und sich der Writer noch nicht bemüßigt fühlt, die Daten auch wirklich zu verschicken...
Versuche es mal ungepuffert oder mit einem flush().
 
B

Big Al

Gast
Hi,
das hätte wirklich sein können, denn ich versende zum testen grade nur ein "Hello World". Aber leider bringen beide Vorschläge nicht das gewünschte Ergebnis. Trotzdem vielen Dank für den Vorschlag!
Alexander
 
T

tuxedo

Gast
Hast du mal versucht den Buffer* wegzulassen? Der machts in deinem Fall nicht unbedingt einfacher oder schneller...


btw:

Code:
catch (InterruptedException ex) {
                        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                    }

Das ist irgendwie stumpfsinnig. In der Regel holt man sich den Logger gleich als Instanzvariable und benutzt ihn dann Klassenweit. Aber den in jeder Exception anzulegen .... ich weiß nicht.

Gruß
Alex
 
S

SlaterB

Gast
schreibe statt in den Socket zunächst einmal in einem StringWriter/ ByteArrayOutputStream und schaue dir im Programm an, was dort herauskommt

oder auch per FileWriter in eine Datei,

-------

außerdem solltest du bedenken, dass
reader.readLine();
erst dann was lesen kann, wenn die Gegenseite auch einen Zeilenumbruch schickt,
aber da available() 0 ist, dürfte das Problem woanders sein
 
G

Guest

Gast
außerdem solltest du bedenken, dass
reader.readLine();
erst dann was lesen kann, wenn die Gegenseite auch einen Zeilenumbruch schickt,
aber da available() 0 ist, dürfte das Problem woanders sein
Guter Punkt, das muss auf jeden Fall geändert werden. Der Vorschlag mit dem File ist auch gut, werde ich gleich mal ausprobieren.
Zu der Exception:
Also das find ich ja an Java ein bisschen komisch, dass man jede eventuelle Exception abfangen muss. Obwohl es ja eigentlich Sinn macht. Das try - catch hat NetBeans erstellt, da hab ichs einfach so gelassen.
Meinst du, dass der Logger in ein Singleton sollte?
Naja, mein Hauptaugenmerk liegt erst mal darauf, das Ding zum Senden und Empfangen zu bringen, dann wende ich mich den Schönheitsfehlern zu. Ist sozusagen mein Startprojekt für Java, das mich mal ein bisschen motivieren soll. Dafür muss das Ganze erst funktionieren.
Vielen Dank für die guten Vorschläge, werde ich alles gleich ausprobieren.
Grüße,
Alexander
 

Wildcard

Top Contributor
tuxedo hat gesagt.:
Das ist irgendwie stumpfsinnig. In der Regel holt man sich den Logger gleich als Instanzvariable und benutzt ihn dann Klassenweit. Aber den in jeder Exception anzulegen .... ich weiß nicht.
API-Doc lesen :wink:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/logging/Logger.html#getLogger(java.lang.String)
 
B

Big Al

Gast
Hi,
ich habe jetzt mal den Output des Clients in ein File schreiben lassen und dort kommt auch alles super an. Das seltsame ist, dass die accept()-Methode ja den Client annimt und eine Verbindung herstellt. Dass der Stream an eine falsche Adresse geht ist damit ja ausgeschlossen.
Ich bin leider nach wie vor ziemlich ratlos.
Alexander
 
T

tuxedo

Gast
Wildcard hat gesagt.:
tuxedo hat gesagt.:
Das ist irgendwie stumpfsinnig. In der Regel holt man sich den Logger gleich als Instanzvariable und benutzt ihn dann Klassenweit. Aber den in jeder Exception anzulegen .... ich weiß nicht.
API-Doc lesen :wink:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/logging/Logger.html#getLogger(java.lang.String)

Ja, sorry, die APIDOC hab ich schon (fast) vor Jahren zu dem Thema konsultiert. Anlegen ist etwas falsch ausgedrückt. "Holen" im wäre geschickter gewesen. Dennoch macht dieses Vorgehen den Code nicht besonders übersichtlich/leserlich.

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Socket jamod WriteMultipleRegistersRequest ist keine ModBus/TCP Nachricht Netzwerkprogrammierung 1
Sogomn IRC-Nachricht Regex Netzwerkprogrammierung 0
H Socket Java | Server sendet Nachricht nur wenn vorher eine JOptionPane-Nachricht ausgegeben wurde. Netzwerkprogrammierung 2
M Nur die erste Nachricht kommt beim Server an Netzwerkprogrammierung 11
I Server schickt eine Nachricht an Broadcast Netzwerkprogrammierung 2
J Nachricht kommt erst nach beendigung der Anwendung an Netzwerkprogrammierung 4
G Nachricht an Server unverändert Netzwerkprogrammierung 2
H Neues NIO problem nachricht an alle clients Netzwerkprogrammierung 3
G Nachricht an mehrere Clients schicken Netzwerkprogrammierung 10
A JavaMail Problem - Nachricht wird nicht versendet ? Netzwerkprogrammierung 9
H SOAP-Nachricht mit Java Netzwerkprogrammierung 8
G Nachricht von server an alle clients senden Netzwerkprogrammierung 6
M wichtig!! Bitte!! (Nachricht von Server an Client senden) Netzwerkprogrammierung 2
K Tabelle im Web über Listener aufrufen Netzwerkprogrammierung 1
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
B Zip Dateien über FTP laden Netzwerkprogrammierung 2
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
L Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory Netzwerkprogrammierung 5
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
T VPN-Verbindung über Java Netzwerkprogrammierung 4
V Einfachen Javaserver über das Internet erreichbar machen Netzwerkprogrammierung 2
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
Thallius Java Application über ZScaler benutzer? Netzwerkprogrammierung 0
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
antonbracke Multiuser Software über XMPP Server Netzwerkprogrammierung 1
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
I ASCII über serielle Schnittstelle Netzwerkprogrammierung 1
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
T Socket Methoden über Internet aufrufen Netzwerkprogrammierung 1
S Socket Kommunikation über Internet Netzwerkprogrammierung 1
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S Datei schreiben über Applet Netzwerkprogrammierung 8
G Klassen über Netzwerk kommunizieren lassen Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
A TCP über UDP Verbindung? Netzwerkprogrammierung 10
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
D JNLP über Webstart funktioniert nicht... Netzwerkprogrammierung 2
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
A Computer über Internet verbinden Netzwerkprogrammierung 12
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
c_sidi90 ideale Lösung, Screen Capture über Netzwerk Netzwerkprogrammierung 3
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
M Map über Webservice übertragen Netzwerkprogrammierung 3
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
Z Socket Connection reset by peer nur per IP nicht über localhost Netzwerkprogrammierung 13
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
G Klassen über JMX per URLClassloader laden? Netzwerkprogrammierung 2
E Zwei PCs über das Internet miteinander verbinden? Netzwerkprogrammierung 3
E Socketverbindung über das Internet - Timeout? Netzwerkprogrammierung 28
M Socket Bilder über das Netzwerk übertragen Netzwerkprogrammierung 4
E Java über Socket ins Internet? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
M Socket JavaProg über einen Clienten steuern Netzwerkprogrammierung 5
M Mail über Exchange versenden Netzwerkprogrammierung 13
F C/S über HTTPS Netzwerkprogrammierung 2
D ...class.getResourceAsStream("/meine.properties") funktioniert nicht über RMI? Netzwerkprogrammierung 3
M ganymed-ssh2.har: ftp-Verbindung über ftp-Proxy Netzwerkprogrammierung 2
J Probleme bei RSA mit byte[] bei Versand über RMI Netzwerkprogrammierung 2
Z File über Socket lesen Netzwerkprogrammierung 3
A HTTP Binärdaten über PHP-Skript in Datenbank schreiben bzw auslesen Netzwerkprogrammierung 2
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
P FTP isFile() über FTP Netzwerkprogrammierung 3
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
N String als byte Array über Socket versenden Netzwerkprogrammierung 8
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12

Ähnliche Java Themen

Neue Themen


Oben