lange Strings senden

Status
Nicht offen für weitere Antworten.

muge

Mitglied
Hallo zusammen.

Die Zeile 3 des folgenden Codeschnipsels wirft manchmal eine Exception:
java.lang.ArrayIndexOutOfBoundsException: 256

Code:
socket = new Socket(ip, port);
out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(msg.toString());

msg ist ein Objekt, welches eigentlich nur eine Datenstruktur ist (mit get/set Methoden).

Die Zeile hat schon unzählige solche msg Objekte versandt, ohne Probleme. Erst seit kurzem passiert manchmal die genannte Exception, bis jetzt nur dann, wenn die msg einen StackTrace enthält, welcher zu einem String zusammengehängt wurde. Grundsätzlich macht dies aber keine Probleme.

Derzeit kann ich den Fehler nicht gezielt Reproduzieren :? , das heisst mit debugging wird nichts.

Strings mit bis zu 20000 Zeichen können ohne Probleme verarbeitet werden. Die msg's, welche diese Exception auslösen, sind wesentlich kürzer.

Hat jemand eine idee, wie wo und warum diese Exception ausgelöst wird? Was bedeutet eine ArrayIndexOutOfBoundsException bei writeObject()?

thx
muge
 

Bleiglanz

Gesperrter Benutzer
warum machst du writeObject?

und dann msg.toString?

schick doch msg selbst (sofern serialisierbar), writeUTF oder verwende einen Writer um einen String zu verschicken?

wird vielleicht oft der gleiche String geschickt? schau mal die API doc zu writeUnshared an...
 

muge

Mitglied
Ich weiss nicht mehr genau, weshalb ich writeObject den Vorzug vor writeUTF gegeben habe. Das senden des objektes habe ich deshalb nicht gemacht, weil der auswertende Prozess nicht unbedingt Java sein soll, auch wenn er es derzeit ist.

Im msg Objekt werden informationen zum loggen transportiert. es wird nie zweimal der gleiche String geschickt.
 

Bleiglanz

Gesperrter Benutzer
muge hat gesagt.:
Ich weiss nicht mehr genau, weshalb ich writeObject den Vorzug vor writeUTF gegeben habe. Das senden des objektes habe ich deshalb nicht gemacht, weil der auswertende Prozess nicht unbedingt Java sein soll, auch wenn er es derzeit ist.

Im msg Objekt werden informationen zum loggen transportiert. es wird nie zweimal der gleiche String geschickt.

Puu, die andere Seite nicht in Java??

in dem fall würde ich rohe bytes senden, damit keine verwirrung mit dem encoding entsteht (das müsste man in diesem Fall fixieren)
 

muge

Mitglied
writeObject ruft über eine Methode writeString die writeByte Methode auf. Habe ich im StackTrace gesehen.

Ich weiss einfach nicht, woher die Exception kommt und wieso.
 

muge

Mitglied
Eigentlich werden ja immer Bits gesendet...

Ich habe aber nicht das Problem dass ich die Daten nicht lesen kann. Mein Problem ist dass manchmal eine ArrayIndexOutOfBoundsException geworfen wird, die ich nicht reproduzieren kann und keine Ahnung habe, wieso sie geworfen wird.
 

Bleiglanz

Gesperrter Benutzer
ich auch nicht

ist am string irgendwas besonderes?

sonderzeichen?

ich würde trotzdem drauf tippen, dass da irgendwas mehrfach geschickt wird (und der objectstream mit seinen back-referenzen durcheinander ist...)
 

muge

Mitglied
Nein, nichts besonderes. das besonderste Zeichen ist ein "$". Es funktioniert auch in 99% aller Fälle und in diesen Fällen sind die Daten korrekt.

Der String der übermittelt wird sieht so aus:

1116414101507 -1 0 0 DEPRECATED LOG ENTRY:0:A IOException occured, Exception is: java.net.ConnectException: Connection refused: connect StackTrace: java.net.PlainSocketImpl.socketConnect(Native Method) java.net.PlainSocketImpl.doConnect(Unknown Source) java.net.PlainSocketImpl.connectToAddress(Unknown Source) java.net.PlainSocketImpl.connect(Unknown Source) java.net.SocksSocketImpl.connect(Unknown Source) java.net.Socket.connect(Unknown Source) java.net.Socket.connect(Unknown Source) ch.retis.wms4.common.interprocesscom.Ipc.connect(Ipc.java:52) ch.retis.wms4.common.interprocesscom.Ipc.syncSend(Ipc.java:84) ch.retis.wms4.common.interprocesscom.IpcClient.send(IpcClient.java:51) ch.retis.wms4.client.masterconsole.JobDetailsProxy.getUptime(JobDetailsProxy.java:42) ch.retis.wms4.client.masterconsole.ObjectArrayWindow.getProcessMessage(ObjectArrayWindow.java:79) ch.retis.wms4.client.masterconsole.ObjectArrayWindow.getNewProcessUpdate(ObjectArrayWindow.java:90) ch.retis.wms4.client.masterconsole.ObjectArrayWindow.access$2(ObjectArrayWindow.java:87) ch.retis.wms4.client.masterconsole.ObjectArrayWindow$2.run(ObjectArrayWindow.java:62) java.util.TimerThread.mainLoop(Unknown Source) java.util.TimerThread.run(Unknown Source)

Die Linefeeds sind zur besseren Lesbarkeit eingefügt worden, sind aber nicht im übertragenen String
 

Bleiglanz

Gesperrter Benutzer
is aber nicht der string, sondern seine serialisierte version; ist zwar egal...

wieviele strings schreibst du eigentlich in den Stream? immer nur eins??
 

muge

Mitglied
Das ist der String.
Der StackTrace wird in einen String verwandelt und der wird hinten an die zusätzlichen Daten (ebenfalls Strings) angehängt. Als Trennzeichen werden Tabulatoren verwendet. Das Stringende ist ein Linefeed (solche Fehler merkt aber nur der Empfänger)

Es werden mehrere Strings in den Stream geschrieben. nach jedem schreiben wird der Stream geflusht.

Hat der ObjectStream einen Buffer?
 

muge

Mitglied
Jetzt kommt noch eine Plattformabhängigkeit hinzu. Unter Linux und Netbeans bringe ich den Fehler gar nicht mehr zustande. Mit Eclipse und windows ist er ziemlich regelmässig :?
 

Bleiglanz

Gesperrter Benutzer
Note that there is a significant difference between writing a String into the stream as primitive data or as an Object. A String instance written by writeObject is written into the stream as a String initially. Future writeObject() calls write references to the string into the stream.
 

muge

Mitglied
Ok, habe es jetzt mal gewechselt. writeUTF(). gebracht hat es aber nicht wirklich viel. Anstelle der Exception blockiert es nun beim schreiben. Wie bei C, wenn der andere Prozess nicht liest...
 

Zilchinger

Mitglied
Wichtig ist, das Du den Stream, nachdem du reingeschrieben hast erstmal schließt, sonst kann der Lesende nicht drauf zugreifen. Da gibt es bei Strings immer Probleme
 

muge

Mitglied
ich will den Stream nicht schliessen, weil ich nicht für jede Message die Verbindung neu aufbauen will und schliessen des streams bewirkt ein schliessen des Sockets.

Ausserdem, es funktioniert ja alles, bis auf ganz wenige ausnahmen und die muss ich auch noch in den griff kriegen.
 

muge

Mitglied
Das Problem ist gelöst. Die Klasse, welche die nachricht sendet, ist statisch und es haben mehrere Threads darauf zugegriffen. Da gab es offenbar unterbrüche durch den Scheduler an ungünstigen stellen :-/.
Ich habe den kritischen Teil jetzt synchronized gemacht und es läuft wie gewünscht.

Was ich weiterhin etwas seltsam finde ist, dass der Fehler unter Linux nicht aufgetreten ist. Als würde die VM für Linux das ganze bereits Threadsafe behandeln und die VM von Windows nicht.

Danke für die Hilfe.
cu
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B lange Strings in http-Request? Netzwerkprogrammierung 3
S JApplet dauert lange Netzwerkprogrammierung 14
S RMI Polling oder lange Verbindungen Netzwerkprogrammierung 6
X Versenden von Objekten braucht zu lange Netzwerkprogrammierung 5
A Lange wartezeit bei Netzwerkzugriff... Netzwerkprogrammierung 5
S BufferedReader blockiert zu lange Netzwerkprogrammierung 4
D Lange Zeilen in Emails werden umgebrochen Netzwerkprogrammierung 2
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
D Strings per Schleife zum Client senden Netzwerkprogrammierung 4
B Socket NIO-Server/Client-Abgeschnittene Nachrichten (Strings) Netzwerkprogrammierung 6
Q Problem bei Vergleichen von Strings übertragen über eine Socketverbindung Netzwerkprogrammierung 3
G Verschlüsselte Strings über Netzwerk verschicken Netzwerkprogrammierung 19
H Empfangen von Strings Netzwerkprogrammierung 14
W Socket Client-Server Verbindung. Wie Strings senden? Netzwerkprogrammierung 6
B Strings versenden | Nur 1 Client Netzwerkprogrammierung 6
G Strings über Sockets senden Netzwerkprogrammierung 5
B Problem mit der Ausgabe eines Strings an SocketOut Netzwerkprogrammierung 4
OnDemand Daten per API senden, parallel Netzwerkprogrammierung 9
M Socket Senden an alle verbundenen Clients Netzwerkprogrammierung 3
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
E Socket Befehl senden und antowrt bekommen ! Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
L Socket Nachrichten senden Netzwerkprogrammierung 3
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J HTTP Befehl via HTTP senden ohne Browser öffnen Netzwerkprogrammierung 3
B Java+Grbl: G-Code Befehle mit Java an Arduino senden und lesen Netzwerkprogrammierung 1
M Socket Bilder senden Netzwerkprogrammierung 1
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
W Socket Byte Array senden Netzwerkprogrammierung 2
G Mail senden funktioniert nicht mit SSL Netzwerkprogrammierung 7
M MultiClient Server - Senden an alle Clients Netzwerkprogrammierung 8
X UDP - Zu großes Paket senden Netzwerkprogrammierung 1
fLooojava Daten an ein Arduino im selben Netzwerk senden Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
M Teilnehmerliste vom Server auch an alle Clients senden Netzwerkprogrammierung 0
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
I Kleine Dateien senden Netzwerkprogrammierung 3
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
S Server-Client: Image senden Netzwerkprogrammierung 2
B Socket BufferedImage senden "ohne speichern" Netzwerkprogrammierung 7
P Socket Daten senden mit ServerSocket? Netzwerkprogrammierung 2
Z Socket Probleme beim Senden und Empfangen Netzwerkprogrammierung 5
Z Probleme beim Senden von Nachrichten an den Server Netzwerkprogrammierung 9
K Socket Senden und abspeichern Netzwerkprogrammierung 34
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
M Gleicher Port für Senden und Empfangen ? Netzwerkprogrammierung 17
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Empfangen klappt Senden nicht - Connection timed out Netzwerkprogrammierung 12
D daten per post senden Netzwerkprogrammierung 3
M Senden von Daten nicht direkt möglich? Netzwerkprogrammierung 6
B SSH mit Jsch, mehrere Befehle senden Netzwerkprogrammierung 4
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
F Verschiedene Datentypen senden Netzwerkprogrammierung 4
M Befehle an externes Java-Programm senden Netzwerkprogrammierung 8
1 Datei senden/empfangen funzt nicht... Netzwerkprogrammierung 5
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
Weltall 7 HTTP Dateien an PHP-Skript senden Netzwerkprogrammierung 11
T Outputstream Byte-Array senden Netzwerkprogrammierung 2
N Senden eines Arrays Netzwerkprogrammierung 6
F Char über Netzwerk senden Netzwerkprogrammierung 6
C Befehle über ein GUI an Server senden Netzwerkprogrammierung 15
J Befehle an Server senden Netzwerkprogrammierung 5
L Zeitspanne für erneutes senden Netzwerkprogrammierung 16
Kr0e Ggf. Performanceproblem durch Senden von vielen kleinen Buffern Netzwerkprogrammierung 17
S Socket OutputStreams senden zu oft Netzwerkprogrammierung 6
D Probleme bei mehreren Clients uns Senden von Messages Netzwerkprogrammierung 16
F Erhalten und Senden von Nachrichten anhand des Indexes des Clients Netzwerkprogrammierung 19
Akrillo Datei per Netzwerk senden Netzwerkprogrammierung 10
KeNnY_tHe_OwNeR Empfangen geht, Senden nicht ?! Netzwerkprogrammierung 18
B Befehle an Gameserver senden bzw. empfangen Netzwerkprogrammierung 2
P Probleme beim weiter senden von Datein Netzwerkprogrammierung 10
T HttpClient - Senden via Post Netzwerkprogrammierung 12
Q Datein von Windows nach Mac senden Netzwerkprogrammierung 4
S Bild-Datei von Servlet an Browser senden Netzwerkprogrammierung 8
M Dateien über TCP/IP senden Netzwerkprogrammierung 18
Q NullPointExeption beim Versuch byte[] zu senden/writen Netzwerkprogrammierung 3
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
R Mehrere Dateien über einen Socket senden Netzwerkprogrammierung 2
F Daten senden und empfangen mit Applet Netzwerkprogrammierung 8
G Information an Server senden? Netzwerkprogrammierung 4
D PDF und integer senden Netzwerkprogrammierung 6
M BufferedImage an PHP-Script senden Netzwerkprogrammierung 4
J Problem beim Senden von File Netzwerkprogrammierung 4
S String[] über Socket senden Netzwerkprogrammierung 3
G unbekannte Zeichen beim senden und lesen Netzwerkprogrammierung 2
V Mehrere Streams durch einen Stream senden Netzwerkprogrammierung 14
T Image aus Applet an PHP Seite senden? Netzwerkprogrammierung 3
D BufferedImage über das Netzwerk senden Netzwerkprogrammierung 2
C Flash Daten an Java senden, wie serialisieren? Netzwerkprogrammierung 3
A Broadcast - senden eines Packetes an alle rechner im netz Netzwerkprogrammierung 15
R Bytes als Rohdaten über Socket senden Netzwerkprogrammierung 3
E rxtx serielles senden von Daten Netzwerkprogrammierung 2
D Socket, Daten über BufferedWriter senden Netzwerkprogrammierung 18
V Problem beim Senden von Dateien Netzwerkprogrammierung 4
W Hexadezimal über RS232 senden Netzwerkprogrammierung 9
L webformular automatisch erstellen, senden und auswerten . Netzwerkprogrammierung 2
G Anfrage an Suchmaschine senden Netzwerkprogrammierung 11
M TCP Socket und Server int senden und empfangen Netzwerkprogrammierung 6
M datagramSocket senden u. empangen? Netzwerkprogrammierung 2
V Java /Matrizen senden über TCP/IP / double Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben