Socket Daten empfangen funktioniert nicht richtig - wo liegt der Fehler?

Status
Nicht offen für weitere Antworten.

Björn.J

Mitglied
Hallo zusammen,

ich lerne zur Zeit mit Hilfe von Head First Java, wie ich Netzwerkprogrammierung angehe. Ich habe auch ein kleines Projekt zum Lernen im Auge (eine Art Terminal), aber schon bei den Grundlagen komme ich nicht weiter. Ich habe wirklich schon einige Tutorials durchgearbeitet, aber geholfen hat mir das nicht.

Die Ausgangssituation ist die, dass ich ein Socket zu einem Server öffne. Ich erstelle dann zwei Threads und gebe diesen das Socket an. Der eine Thread soll in einer Endlosschleife einfach - sobald er etwas empfängt - diesen Text auf System.out ausgeben. Der andere Thread wartet 1 Sekunde und sendet einen Befehl an den Server, worauf dieser eigentlich reagieren müsste... und hier liegt das Problem.

Der EmpfängerThread erhält die Begrüßung vom Server und gibt diese aus. Dann sendet der zweite Thread einen Befehl an den Server, aber der EmpfängerThread gibt einfach nichts mehr aus. Die Daten werden auch korrekt gesendet, das habe ich mit Hilfe eines lokalen Mini-Servers getestet.

Die zwei Runnables sehen so aus:
Java:
package core;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class ReceiveDataRunnable implements Runnable {
	
	private Socket s;
	private InputStream in;

	public void run() {
		BufferedReader d = new BufferedReader(new InputStreamReader(in));
		
		 try {
	         while (true) {            
               System.out.println("Received: " + d.readLine());
	         }
	      } catch (Exception e) {}
	}

public void setSocket(Socket s) throws IOException {
		this.s = s;
		this.in = s.getInputStream();
	}

}

Java:
package core;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;

public class SendDataRunnable implements Runnable {
	
	private Socket s;
	private PrintWriter writer;

	public void run() {
			try {
				Thread.sleep(1000);
				System.out.println("Sent: \"help\"");
				writer.write("help");
				writer.flush();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	}

	public void setSocket(Socket s) throws IOException {
		this.s = s;
		writer = new PrintWriter(s.getOutputStream());
	}

}

und das Hauptprogramm sieht so aus
Java:
package core;

import java.net.Socket;

public class TestSpace {
	public static void main(String[] args) {
		new TestSpace().go();
	}

	private void go() {
		
		try {
			Socket s = new Socket("news.usenetserver.com", 119);
			
			SendDataRunnable sdr = new SendDataRunnable();
			sdr.setSocket(s);
			
			ReceiveDataRunnable rdr = new ReceiveDataRunnable();
			rdr.setSocket(s);
			
			Thread sd = new Thread(rdr);
			Thread sc = new Thread(sdr);
		
			sd.start();
			sc.start();
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}		
}

Der Output auf der Konsole sieht so aus:

Received: 200 news.usenetserver.com Welcome! (fe04.ams2)
Sent: "help"

Und dann hörts auf. Wenn ich mich allerdings mit telnet mit dem selben Server verbinde und "help" eingebe, erhalte ich einige Zeilen Text. Das möchte ich durch das Programm auch erreichen.

Wenn jemand einen Hinweis hat, wo das Problem liegt, wäre ich sehr dankbar. Ich habe mitlerweile etliche Stunden damit verbracht, aber bin mittlerweile absolut ratlos...

Viele Grüße,
Björn
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Auf Empfängerseite machst du ein "readLine()". Auf Senderseite sendest du aber keien Zeilenumbruch nach dem "help". Sende mal "help\n" oder "help\r\n" ...

- Alex
 

Björn.J

Mitglied
Hallo tuxedo,

mit "help\r\n" klappt es nun! Wahnsinn, ich habe 15 Stunden den Fehler gesucht und jetzt lag es an einem popeligen "\r". Mit "\n" hatte ich nämlich auch schon probiert.

Vielen Dank!!

Björn
 
T

tuxedo

Gast
Der Zeilenumbruch ist "plattformspezifisch".
Schau mal die Java System Properties durch. Da findest du den für deine Plattform üblichen Zeilenumbruch.

- Alex
 

Björn.J

Mitglied
Hallo Alex,

ich habe mir meine System-Properties mal ausgeben lassen und mein Line-Separator ist 0x0A = \n. (Weil Linux)
Der Server, auf den ich die Anfrage starte scheint aber demnach auf Windows zu laufen. Das erklärt jetzt auch, warum mein Testserver mir den richtigen Eingang von einzelnen Lines angegeben hat, es aber auf dem richtigen Server nicht funktioniert hat.

Gibt es auch eine Möglichkeit, abzufragen was der standartmäßige Line-Separator auf Serverseite ist? Oder kann/sollte ich mit "\r\n" immer auf Nummer sicher gehen?

Grüße,
Björn
 
T

tuxedo

Gast
Also wenn ich mich richtig an die ApiDoc erinnere dann funktioniert das Java-ReadLine() sowohl mit
Code:
\n
als auch mit
Code:
\r\n
. Sollte also keinen Unterschied machen.

Wenn ich deine Zeilen richtig interpretiere dann programmierst du gegen einen eigenen Testserver, willst die Anwendung aber später gegen einen nicht von dir stammenden Server laufen lassen?
Wenn ja: Da musst du die Doku des Servers konsultieren und schauen was der für ein Zeilenumbruch verlangt. Kann sein dass \r\n hardcodiert ist.

Was ist das denn für ein Server?

- Alex
 

Björn.J

Mitglied
Mein Programm soll ein einfacher Usenet-Client werden, also Nachrichten über das NNTP-Protokoll (Network News Transfer Protocol ? Wikipedia) empfangen und versenden können. Das ist einfach ein Projekt für mich zum Lernen.

Mein Testserver (der einfach auf einem Socket horcht und diese Strings ausgibt) funktionierte mit \n als Line-Separator, weil er ja bei mir auf meiner Linuxmaschine läuft.

Der Server, mit dem ich die Probleme hatte (news.usenetserver.com) war schon der Server, mit dem das Programm später mal laufen soll. Hier brauchte ich das "\r\n".

Jetzt muss ich mich mal erkundigen, ob das "\r\n" so in der NNTP-Dokumentation evtl. als Standard festgelegt ist.

Danke nochmal, jetzt kann ich endlich weitermachen. :)

Björn

PS: Aha! "A CRLF pair MUST terminate all commands." (Aus der RFC 3977 zu NNTP) ;-)
 
Zuletzt bearbeitet:
T

tuxedo

Gast
PS: Aha! "A CRLF pair MUST terminate all commands." (Aus der RFC 3977 zu NNTP) ;-)

Na das erklärt das ganze dann ja :) Dein Java-Testserver müsste ja übrigens auch mit dem
Code:
\r\n
zurecht kommen so dass du getrost weitertesten kannst.

Kleine Anregung noch:

Mach die Kommunikation mit dem NNTP doch gleich zur schicken API unter GPL/LGPL/ ... Dann haben alle was davon ;-)

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Daten können nicht sofort empfangen werden Netzwerkprogrammierung 1
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
P Server/Client Daten empfangen, wenn Daten gesendet werden Netzwerkprogrammierung 9
F Daten senden und empfangen mit Applet Netzwerkprogrammierung 8
I Problem beim empfangen von Daten (Zahlen) Netzwerkprogrammierung 7
OnDemand Daten per API senden, parallel Netzwerkprogrammierung 9
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S Daten über TCP/IP senden Netzwerkprogrammierung 3
B Daten an Javaprogramm per URI Aufruf übergeben Netzwerkprogrammierung 7
N websocket - keine Daten mehr nach ca 80 Sekunden Netzwerkprogrammierung 0
C Spezielle Daten aus Website entnehmen Netzwerkprogrammierung 5
H Daten auf einer Webseite eintragen Netzwerkprogrammierung 11
A Socket Daten in Textdokument speichern? Netzwerkprogrammierung 1
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
J Daten von einem HTML-Textfeld abrufen Netzwerkprogrammierung 3
S Fakturierungsprogramm - Daten aktuell halten (blutiger Anfänger) Netzwerkprogrammierung 1
D Mit Server Daten austauschen Netzwerkprogrammierung 4
K Server liest Daten nicht Netzwerkprogrammierung 6
L HTTP Daten an Server übergeben Netzwerkprogrammierung 2
R Daten von Cloud laden Netzwerkprogrammierung 5
fLooojava Daten an ein Arduino im selben Netzwerk senden Netzwerkprogrammierung 1
P Socket Best Practice: Daten bündeln Netzwerkprogrammierung 5
E Verfügbarkeit von Daten in Streams Netzwerkprogrammierung 4
F Daten aus Internetseiten auslesen Netzwerkprogrammierung 56
S Server Client Daten hin und herschicken Netzwerkprogrammierung 2
P Socket Daten senden mit ServerSocket? Netzwerkprogrammierung 2
H Daten an Textfeld einer Webseite schicken Netzwerkprogrammierung 2
A versch. Daten im Stream erkennen Netzwerkprogrammierung 2
D daten per post senden Netzwerkprogrammierung 3
M Senden von Daten nicht direkt möglich? Netzwerkprogrammierung 6
J Applet soll Daten auf Server ablegen - einfachster Weg fuer n00bs? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
F UDP Daten kommen nicht an Netzwerkprogrammierung 22
E Socket OutputSream abbruch.Wegen zuviel !empfangener! Daten? Netzwerkprogrammierung 10
C Client zu Client Daten übertragen Netzwerkprogrammierung 13
S Thread, Daten vom Socket lesen Netzwerkprogrammierung 2
S Socket XML-Daten und Parameter an Server schicken Netzwerkprogrammierung 3
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
P HttpClient - Daten einer Website "unvollständig" Netzwerkprogrammierung 5
K Socket Daten lesen ohne Längenangabe Netzwerkprogrammierung 19
T RMI Effizenteste Übertragung von Daten Netzwerkprogrammierung 6
A Socket Client Server Connection wird aufgebaut aber keine daten geschickt. Netzwerkprogrammierung 5
Kr0e Versenden von Daten übers Netzwerk Netzwerkprogrammierung 30
E Daten kommen anders an als gesendert ?! Netzwerkprogrammierung 6
S HttpURLConnection POST splittet Daten in zwei Pakete Netzwerkprogrammierung 9
F POST-Daten sende Netzwerkprogrammierung 3
E HTTPS Debuggen (verschlüsselte Daten anzeigen)? Netzwerkprogrammierung 12
N Per POST -Methode Daten an den Web-Server übertragen. Netzwerkprogrammierung 9
Iron Monkey Große Daten ins Vector füllen Netzwerkprogrammierung 4
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
D Daten, die mit PHP erzeugt werden, mit Java auslesen Netzwerkprogrammierung 8
M Ethernet Daten abfangen Netzwerkprogrammierung 13
S Daten per GET-Methode Netzwerkprogrammierung 2
H Server soll Daten schicken, aber wie? Netzwerkprogrammierung 47
M Socket schließt bevor Daten komplett geladen Netzwerkprogrammierung 5
C Flash Daten an Java senden, wie serialisieren? Netzwerkprogrammierung 3
E rxtx serielles senden von Daten Netzwerkprogrammierung 2
D Socket, Daten über BufferedWriter senden Netzwerkprogrammierung 18
G TCP Verbindung überprüfen OHNE daten zu verschicken Netzwerkprogrammierung 11
M Daten übers Netz verschlüsselt übertragen? Wie? Netzwerkprogrammierung 18
J Post-Daten an URL schicken Netzwerkprogrammierung 2
U Image erzeugen aus empfangenen Daten Netzwerkprogrammierung 7
A Wie werden Daten versendet? "Crashcode" Netzwerkprogrammierung 4
D Frage: Buffered Reader --> Wie komm ich an die Daten (Byt Netzwerkprogrammierung 3
G unvollständige Daten: Http Client-Server-Kommunikation Netzwerkprogrammierung 2
E Multi-Part Form-Daten mit HttpURLConnection Netzwerkprogrammierung 6
A Datenverlust (zuviele Daten!) über Sockets Netzwerkprogrammierung 4
T Daten über GSM verschicken Netzwerkprogrammierung 4
M Einfachste Möglichkeit aus'm Applet Daten an Server senden Netzwerkprogrammierung 6
P Verschiedene Daten über einen Stream Netzwerkprogrammierung 4
M Verliere Daten mit WinXP Netzwerkprogrammierung 10
O eingehende Daten speichern Netzwerkprogrammierung 3
D UDP-Daten anzeigen Netzwerkprogrammierung 2
D Daten per Server- Client nur als byte verschicken? Netzwerkprogrammierung 3
A daten an php script per post senden und ausgabe einlesen Netzwerkprogrammierung 6
G UDP Packet empfangen funktioniert nicht. Netzwerkprogrammierung 16
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
T UDP Pakete empfangen ohne Programm zu blockieren Netzwerkprogrammierung 3
B Nach Verbindung gleich ObjectStream empfangen Netzwerkprogrammierung 1
K Socket Chat-GUI eigenes Event nach Empfangen Netzwerkprogrammierung 2
Z Socket Probleme beim Senden und Empfangen Netzwerkprogrammierung 5
M Gleicher Port für Senden und Empfangen ? Netzwerkprogrammierung 17
T Empfangen klappt Senden nicht - Connection timed out Netzwerkprogrammierung 12
1 Datei senden/empfangen funzt nicht... Netzwerkprogrammierung 5
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
A Socket DNS Update Pakete empfangen Netzwerkprogrammierung 3
KeNnY_tHe_OwNeR Empfangen geht, Senden nicht ?! Netzwerkprogrammierung 18
B Befehle an Gameserver senden bzw. empfangen Netzwerkprogrammierung 2
M Client/Server Antwort von Server empfangen Netzwerkprogrammierung 6
H Empfangen von Strings Netzwerkprogrammierung 14
A String per ByteBuffer empfangen? Netzwerkprogrammierung 6
M TCP Socket und Server int senden und empfangen Netzwerkprogrammierung 6
G Probleme mit Firewall beim empfangen von dateien über socket Netzwerkprogrammierung 6
F Datei senden und empfangen Netzwerkprogrammierung 4
D DatagramSocket Empfangen Textarea Netzwerkprogrammierung 2
M Vom Server per Socket Empfangen, aber wieviel Bytes? Netzwerkprogrammierung 11
TRunKX Hilfe beim senden und empfangen Netzwerkprogrammierung 2
D Performance Problem beim File senden, empfangen Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben