Daten kommen anders an als gesendert ?!

Status
Nicht offen für weitere Antworten.

Eule

Mitglied
Guten Tag an alle hier

Ich habe einen ObjectOut- und InputWriter, den ich so erstellt habe

Java:
outWrtr  = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
new ObjectInputStream(socket.getInputStream());


Das senden der Daten geschieht über eine Methode sendMessage()

Java:
public synchronized void sendMessage(LinkedList<Object> send) 
	throws NullPointerException, IOException {
		
		//look for every object the appropriate class
		for(int i=0; i < send.size() ; i++) {
			
			//if the to send object is a Short
			if(send.get(i) instanceof Short) {
				Short x = (Short)send.get(i);
				outWrtr.writeShort(x);
//				outWrtr.flush();
			}
			
			//if the to send Object is a String
			else if(send.get(i) instanceof String) {
				outWrtr.writeUTF((String)send.get(i));
//				outWrtr.flush();
			}
			
			//if the to send Object is an Integer
			else if(send.get(i) instanceof Integer) {
				outWrtr.writeInt((Integer)send.get(i));
//				outWrtr.flush();
			}
			
			//if the to send Object is a Boolean
			else if(send.get(i) instanceof Boolean) {
				outWrtr.writeBoolean((Boolean)send.get(i));
//				outWrtr.flush();
			}
		}
		outWrtr.flush();
		outWrtr.reset();
	}

Dort sollen die 4 verschiedenen Objekte gesendet werden und zwar in der Reihenfolge, wie sie in der Liste sind. Die 1. Frage ist: Darf ich das überhaupt machen? verschiedene schreiboperationen auf einen Stream setzen?

Auf der Gegenseite wird der Inputstream ebenfalls wie oben erstellt.

Wenn ich jetzt ein paar Daten drüber gesendet habe (jede Klasse mehrmals) dann sendet empfängt die Gegenstelle irgendwann Unsinn.
Also Beispiel wollte ich nur ein Short = 6 drüber senden und laut Debugger sendet er das auch ab. Auf der Empfängerseite kommt dann aber mit
Java:
short code = inRdr.readShort();
der Wert 1536 raus. Das jedes Mal. Wie gesagt, am Anfang funktioniert das Senden prima.

Könnte mir jemand etwas Hilfestellung geben?

Danke schon mal

Eule
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Was du nicht tun solltest:

* Auf einer Verbindung mehrere Streamtypen mischen
* In die eine Richtung Typ A und in die andere Richtung Typ B benutzen

Speziell der Object*Stream fährt intern ein eigenes, minimalistisches Protokoll, weswegen ihn man nicht mit anderen Streamtypen mischen sollte.

Ich rate dir (wie vielen anderen auch) zu einem entsprechenden eigenen Protokoll, oder eben zu RMI/SIMON/andere vergleichbare Lösung.
 

Eule

Mitglied
Meinst du mit Streamtypen so was wie BufferedStream usw? Sry. Ich kann mich dort noch nicht so gut aus.
Ich habe jetzt einfach mal den BufferedStream entfernt. Aber der Fehler tritt trotzdem noch weiterhin auf.
 
T

tuxedo

Gast
Du kannst Streams ineinander verketten:

Empfangsrichtung: InputStream -> InputStreamReader -> BufferedInputStream
Senderichtung: OutputStream -> OutputStreamReader -> BufferedOutputStream

Was du halt nicht tun solltest ist auf Sende und/oder Empfangsrichtung z.B. einen Object*Stream zu benutzen und 5min später dann einen Data*Stream ...

Auch solltest du auf der Sende UND Empfangsrichtung die gleichen Typen benutzen. Also nicht beim Senden den PrintStreamWriter benutzen und beim Empfangen dann den ObjectInpuptStream...


Aber wie gesagt: Du solltest dir entweder ein Protokoll überlegen, oder eben etwas benutzen das dir die Kommunikation erleichtert und intern mit einem Protokoll arbeitet.

- Alex
 

Eule

Mitglied
ich kenne mich mit erstellen von Protokollen nicht so gut aus. Kannst du mir einen Link mit Literatur geben, wo ich mich etwas einarbeiten kann?
 
T

tuxedo

Gast
Sorry. Ich kenne kein Buch das sich mit dem erstellen von Protokollen beschäftigt. I.d.R. ist das auch nicht nötig wenn man erstmal "den Schubser in die richtige Richtung" bekommen hat.

Würde dir erstmal dazu raten den Data(Input/Output)Stream zu benutzen. Damit kannst du bequem Strings, primitive Datentypen und Objekte übers Netz schicken.

Dann geht's ran ans Protokoll. Eine einfache Protokollbasis könnte so aussehen:

[byte] Nachrichtentyp: Hiermit kannst du bis zu 256 verschiedene Nachrichtentypen codieren
[body der Nachricht]

So. du schickst also vor der eigentlichen Nachricht ein byte raus. Dieses Byte beschreibt dir quasi wie die nachkommende Nachricht aussieht.

FÜr eine Textnachricht könnte das wie folgt aussehen:

[1]
["Hallo Welt"]

Du gehst also hin und sendest eine 1 als byte. Der Empfänger weiß dann: Oh, eine 1. Das ist eine Textnachricht. Ich muss nun einen String vom DataInputStream lesen.

Danach willst du vllt. eine Datei schicken. So eine Nachricht kodierst du dann meinetwegen mit 2 als byte. Der body der Nachricht ist dann z.B. so aufgebaut:

[String] Name der Datei
[long] Länge der Datei in bytes
[bytes der Datei]

Eine komplette Nachricht zum senden einer Datei würde dann z.B. so aussehen:

[2]
["c:/MeineDatei.ext"]
[4850]
[bytes der Datei]

Der Empfänger liest also als erstes wieder ein einzelnes byte und findet die "2". Damit weiß er: Es handelt sich hier um eine Datei. Mit diesem Wissen liest er einen String ein, welcher gemäß vorher spezifiziertem Body den Namen der Datei darstellt. Als nächstes liest er einen Long-Wert. Damit weiß er wie groß die Datei ist und wieviele bytes er lesen muss um a) die Datei komplett zu empfangen und b) wann die nächste Nachricht beginnt.

Natürlich ist das nur ein Weg wie man ein Protokoll aufbauen kann. Aber es ist ein recht gebräuchlicher Weg der einfach zu handhaben ist.

- Alex
 

Eule

Mitglied
Danke. Genau so hatte ich das bereits gemacht. Gut zu wissen, dass ich mit der Verfahrensweise nicht auf dem Holzweg bin.

Der Fehler lag wohl wo anders. Ich musste das Programm noch mal auf Bandbreite trimmen und haben andere Reader und Writer genommen und dann ging es.

Vielen Danke für die Hilfe
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F UDP Daten kommen nicht an Netzwerkprogrammierung 22
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
X Daten können nicht sofort empfangen werden Netzwerkprogrammierung 1
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
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
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
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
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
P Server/Client Daten empfangen, wenn Daten gesendet werden Netzwerkprogrammierung 9
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
B Socket Daten empfangen funktioniert nicht richtig - wo liegt der Fehler? Netzwerkprogrammierung 7
Kr0e Versenden von Daten übers Netzwerk Netzwerkprogrammierung 30
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
F Daten senden und empfangen mit Applet Netzwerkprogrammierung 8
I Problem beim empfangen von Daten (Zahlen) Netzwerkprogrammierung 7
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
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
V Woher kommen diese Exceptions (StreamCorruptedException,OptionalDataException)? Netzwerkprogrammierung 1
S UDP Broadcast - Pakete kommen nicht immer an Netzwerkprogrammierung 15
S RMI RMI Aufrufe kommen nicht mehr durch Netzwerkprogrammierung 4
A [URLConnection] Bilder hochladen - aber anders! Netzwerkprogrammierung 4

Ähnliche Java Themen


Oben