Socket InputStream liest nicht vollständig

MichaelGER

Mitglied
Hallo,

ich schreibe zurzeit ein kleines Projekt für Minecraft. Unter anderem soll damit die Konsole überwacht werden.

Auf dem Server läuft ein ServerSocket, der die Verbindungen entgegennimmt.
Der Client verbindet über "normalen" Socket.
Die Verbindung findet über Streams statt (TCP).

Wenn ich den Server bei mir starte, und dort den Inhalt der Konsole abfrage, kommt der komplette Inhalt an. Sobald ich das gleiche auf einem externen Server probiere gibts allerdings Probleme. Zu Übertragung habe ich mir ein paar Methoden geschrieben.

Hier ein Auszug der wichtigen (die System.out.println() sind nur zum Finden des Fehlers drin)

Java:
    public static void writeStringList(ArrayList<String> strings, OutputStream out) throws IOException
    {
        writeInt(strings.size(), out);
        for (String s : strings)
        {
            writeString(s, out);
        }
    }

    public static String[] readStringList(InputStream in) throws IOException
    {
        int num = readInt(in);
        String[] strings = new String[num];
        for (int i = 0; i < num; i++)
        {
            strings[i] = readString(in);
        }
        return strings;
    }

    public static void writeString(String string, OutputStream out) throws IOException
    {
        byte[] bytes = string.getBytes();
        System.out.println("Schreibe int: " + bytes.length);
        writeInt(bytes.length, out);
        System.out.println("Schreibe String:" + string);
        out.write(bytes);
        out.flush();        
    }

    public static String readString(InputStream in) throws IOException
    {
        int len = readInt(in);
        System.out.println("Empfange String der Laenge: " + len);
        byte[] bytes = new byte[len];
        in.read(bytes);
        String s = new String(bytes);
        System.out.println("String empfangen: " + s );
        return s;
    }

    public static void writeInt(int i, OutputStream out) throws IOException
    {
        out.write(intToByteArray(i));
        out.flush();
    }

    public static int readInt(InputStream in) throws IOException
    {
         byte[] intBytes = new byte[4];
         in.read(intBytes);
         ByteBuffer buff = ByteBuffer.wrap(intBytes);
         int i = buff.getInt();
         return i;
    }

    public static byte[] intToByteArray(int i)
    {
        byte[] intBytes = new byte[4];
        ByteBuffer buff = ByteBuffer.wrap(intBytes);
        buff.putInt(i);
        return intBytes;
    }

Der Server hat jede Zeile der Konsole als eigenen String in einer ArrayList. Diese sendet er über die Methode writeStringList().

Der Client liest mit readStringList().

Das ganze klappt mit den ersten ca. 150 Zeilen ohne Probleme.

Doch dann tritt folgendes auf:

Server:
Schreibe int: 56
Schreibe String: [WorldGuard] (world_nether) Fire spread is UNRESTRICTED.

Client:
Empfange String der Laenge: 56
String empfangen: [WorldGuard] (worl

Empfange String der Laenge: 1683975781
Exception in thread "IOQueue" java.lang.OutOfMemoryError: Java heap space

Diese 1683975781 sind genau die nächsten 4 Bytes (d_ne).
Außer dieser einen Exception wurde keine weitere geworfen.

Meine Fragen:
Wieso bricht der Stream hier ab, bevor er die 56 Bytes vollständig gelesen hat?
Ich übergebe den oben genannten Methoden Buffered Streams, hat das etwas mit dem Problem zu tun? (kann ich mir zwar nur schwer vorstellen, aber wer weiß :p)
Hab ich hier einen Fehler drin?
Gibts eine bessere Möglichkeit das zu erledigen?

Für Antworten, Hinweise, Ideen, Vorschläge, etc. bin ich dankbar :)
 

fastjack

Top Contributor
Du mußt erstmal den OutOfmemory wegbekommen, sonst kannst halt auch nix mehr lesen.

Empfange String der Laenge: 1683975781

ist ein bisschen irreführend. Ich hatte gedacht der String wäre 1683975781 Zeichen lang, es ist wohl aber einfach ein int, das gelesen wurde.
 

MichaelGER

Mitglied
Erstmal danke für die Antwort :)

Du mußt erstmal den OutOfmemory wegbekommen, sonst kannst halt auch nix mehr lesen.

Der OutOfMemory ist eher das Resultat eines Fehlers(siehe nächster Absatz)


ist ein bisschen irreführend. Ich hatte gedacht der String wäre 1683975781 Zeichen lang, es ist wohl aber einfach ein int, das gelesen wurde.

Richtig. Erst wird der int gelesen. Dieser sagt, wie lange der folgende String ist. Dementsprechend viel Speicher wird reserviert. Weil der int hier so groß ist -> OutOfMemory.

So groß ist der int aber eigentlich gar nicht (der Server schreibt ja einen viel kleineren int). Aber da hier mitten im String aufgehört wird zu lesen, werden die nächsten 4 bytes (in dem Fall "d_ne") eingelesen und als int gewertet. Daher der falsche Wert.
 

irgendjemand

Top Contributor
@TO
ich geb dir mal n tipp

1) das hier ist KEIN minecraft-forum ... melde dich bei problemen bitte in den entsprechendne foren *so wie mir das aussieht ist das Bukkit*
2) wenn überhaupt ... dann verwendet man für Objekte den [japi]ObjectOutputStream[/japi]
alternativ kann man bei reinen Strings auch BufferedWriter/PrintStream und auf der anderen seite BufferedReader verwenden ...
3) nimm um gottes willen das static raus ... das sieht ja aus wie von nem 2-wochen-anfänger ...
 

MichaelGER

Mitglied
1) das hier ist KEIN minecraft-forum ... melde dich bei problemen bitte in den entsprechendne foren *so wie mir das aussieht ist das Bukkit*

Jop, ist Bukkit. Aber ich arbeite hier beim versenden der Daten (und beim Clienten) nur mit Java Bordmitteln, da bin ich hier, glaub ich jedenfalls, besser aufgehoben ;)

2) wenn überhaupt ... dann verwendet man für Objekte den [japi]ObjectOutputStream[/japi]
alternativ kann man bei reinen Strings auch BufferedWriter/PrintStream und auf der anderen seite BufferedReader verwenden ...

Bisher schicke ich das alles über byte Arrays (byte[]). Also meinst du, es ist sinnvoller, das mit oben genannten Mitteln zu machen?
Dachte halt, dass byte Arrays universal einsetzbar sind.


3) nimm um gottes willen das static raus ... das sieht ja aus wie von nem 2-wochen-anfänger ...

Ich hätte vielleicht dazu schreiben sollen:
Oben handelt sich es um eine eigene kleine Library, welche eingebunden wird (der Server und Client müssen ja auf die gleiche Weise die Daten behandeln). Da diese Library nur ein paar Methoden hat und keinerlei Variablen, oder sonstwas, erschien mir hier das static ein wenig sinnvoller (ähnlich dem Java Math Paket).

Wenn das aber natürlich totaler Schwachsinn ist, änder ich das gerne um :)
 
Zuletzt bearbeitet:

irgendjemand

Top Contributor
mit dem verweis aufs bukkit forum wollte ich eigentlich eher sagen das die da genau wissen wie sowas mit SE mitteln baut ...
wir können dir hier dafür eher weniger bis gar keinen support geben

ja ... ansich ist es besser nur dierekt mit byte-arrays zu arbeiten ... aber da du damit ja probleme hast und eigentlich ein komplexes object ... nämlich die List<?> ... wäre es für dich einfacher mit [japi]ObjectInputStream[/japi] und [japi]ObjectOutputStream[/japi] zu arbeiten ... da du dir dann auch keine gedanken über z.b. irgendwelche längen zu machen wo es ja gerade dran hakt

und das static gehört da nicht rein weil du auf beiden seiten instanzen hast ... sowohl im bukkit die instanz von "JavaPlugin" als auch in deinem client iwas

zusätzlich solltest du deine "lib" in server-plugin und client aufteilen ... das spart einem später viel arbeit
 

MichaelGER

Mitglied
wir können dir hier dafür eher weniger bis gar keinen support geben

Keine Sorge, das verlange ich auch gar nicht :)

ja ... ansich ist es besser nur dierekt mit byte-arrays zu arbeiten ... aber da du damit ja probleme hast und eigentlich ein komplexes object ... nämlich die List<?> ... wäre es für dich einfacher mit [japi]ObjectInputStream[/japi] und [japi]ObjectOutputStream[/japi] zu arbeiten ... da du dir dann auch keine gedanken über z.b. irgendwelche längen zu machen wo es ja gerade dran hakt

Erkennt dann die readObject() Methode vom ObjectInputStream automatisch wie lange das Objekt ist? Vorallem da der ObjectOutputStream ja noch andere Methoden zum Schreiben von Strings, Integers, etc. bietet wär das dann wirklich die bessere Alternative.

und das static gehört da nicht rein weil du auf beiden seiten instanzen hast ... sowohl im bukkit die instanz von "JavaPlugin" als auch in deinem client iwas

Also zählt hier das static auch nicht, obwohl die Funktionen in einer Utility-Klasse (jedenfalls ist sie so designed) sind?

zusätzlich solltest du deine "lib" in server-plugin und client aufteilen ... das spart einem später viel arbeit

Bisher ist das so:
Server und Client sind jeweils eigenständige Projekte. Die lib (komplett eigenständige Klasse) wird halt von beiden genutzt (wie gesagt, Utility-Klasse), damit die gleiche Vorgehensweise bei beiden sichergestellt ist.
 
Zuletzt bearbeitet:

MichaelGER

Mitglied
Sorry für Doppelpost, aber dank dem Hinweis von "irgendjemand" konnte ich das Problem lösen.

Vor lauter selber machen, hab ich ganz übersehen, dass es dafür bereits fertige Lösungen gibt.

In meinem Fall wären das, wie von irgendjemand schon angesprochen, der ObjectOutput/InputStream und der DataOutput/InputStream. Damit klappt die Übertragung auch einwandfrei.

Nochmals danke an alle für die Antworten :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
A InputStream liest immer komplettes PHP-Script Netzwerkprogrammierung 6
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
S Socket String InputStream in hex umwandeln Netzwerkprogrammierung 1
D GZIP InputStream lesen ohne zu encoden Netzwerkprogrammierung 1
F Java Server Scanner oder InputStream kann nicht gelsesen werden! Netzwerkprogrammierung 6
R Socket InputStream readObject > Connection Reset Netzwerkprogrammierung 3
windl InputStream cachen Netzwerkprogrammierung 3
K Socket InputStream wird nicht erzeugt Netzwerkprogrammierung 4
K Byte für Byte aus InputStream lesen Netzwerkprogrammierung 5
F JSch - inputstream is closed Netzwerkprogrammierung 13
M Socket InputStream sendet ausgaben von OutputStream zurück Netzwerkprogrammierung 2
D Inputstream to Outputstream Netzwerkprogrammierung 3
M InputStream and ObjectInputStream zur gleichen Zeit Netzwerkprogrammierung 11
T Inputstream -> verschiedene Objekte lesen Netzwerkprogrammierung 3
MQue Inputstream Timeout Netzwerkprogrammierung 2
S Servlet InputStream leer?! Netzwerkprogrammierung 14
G HTTP-Request InputStream-Problem Netzwerkprogrammierung 5
P Inputstream "verfügbar" Netzwerkprogrammierung 4
G JPG im InputStream Netzwerkprogrammierung 2
A InputStream ließt nur 65536 Zeichen anstatt ganzer Puffer Netzwerkprogrammierung 8
A inputstream teilen? Netzwerkprogrammierung 4
D InputStream (Socket) mit BufferedInputStream puffern Netzwerkprogrammierung 2
M Sockets und InputStream Netzwerkprogrammierung 8
R Client nimmt den Inputstream nicht an Netzwerkprogrammierung 5
S Mail anhang in InputStream packen Netzwerkprogrammierung 5
M InputStream - Bytes gehen verloren? Netzwerkprogrammierung 3
E Problem bei Sockets/InputStream über externe Klasse Netzwerkprogrammierung 5
André B. In einen InputStream schreiben? Netzwerkprogrammierung 6
G inputstream hat plötzlich weniger inhalt Netzwerkprogrammierung 8
Z ProgressBar auf BufferedOutput- & -InputStream Netzwerkprogrammierung 2
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
A Socket-Anwendung (BufferedWriter/Reader liest nicht aktuellen Wert) Netzwerkprogrammierung 6
R Anfängerbeispiel: Suche Java-Anwendung die http-Anfragen in Tomcat liest Netzwerkprogrammierung 8
K Server liest Daten nicht Netzwerkprogrammierung 6
S Socket Client liest leeres Objekt Netzwerkprogrammierung 10
C Socket ObjectInputStream liest nur Objekte der jeweiligen Programminstanz Netzwerkprogrammierung 5
R TCP Server liest nichts Netzwerkprogrammierung 8
H PC-A sendet, PC-B liest aus Netzwerkprogrammierung 32
JavaDevOp Socket Status von UDP-Port prüfen (PortUnreachableException funktioniert nicht?) Netzwerkprogrammierung 32
A Bei FTP Übertragung wird Datei nicht komplett übertragen Netzwerkprogrammierung 2
B Multicast-Nachrichten-Empfang funktioniert nicht Netzwerkprogrammierung 5
M JAX-WS unter Java 17 plötzlich nicht mehr möglich Netzwerkprogrammierung 5
S BufferedStream funktioniert nicht immer Netzwerkprogrammierung 7
T OutputStream kommt nicht an Netzwerkprogrammierung 18
G UDP Packet empfangen funktioniert nicht. Netzwerkprogrammierung 16
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
S .jar läuft local, aber nicht remote (SSH/Terminal) Netzwerkprogrammierung 10
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
J SSL haut nicht hin Netzwerkprogrammierung 3
platofan23 Socket Java Socket mit DynDns nicht erreichbar Netzwerkprogrammierung 6
J Wechsel auf Jdk13 , sfpt funktionier nicht mehr Netzwerkprogrammierung 2
Dann07 Proxy funktioniert nicht so wie gewünscht! Netzwerkprogrammierung 18
B RESTful API weiß nicht weiter Netzwerkprogrammierung 2
L Kann VM nicht ueber Host Name finden Netzwerkprogrammierung 0
V Ich finde den Fehler nicht... Netzwerkprogrammierung 2
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
S Socket Webserver mit SSLSocket geht nicht Netzwerkprogrammierung 1
P RMI stub wird nicht gefunden Netzwerkprogrammierung 8
N Test Servlet funktioniert nicht Netzwerkprogrammierung 11
M com.google.gson wird nicht erkannt Netzwerkprogrammierung 2
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D FTP ListNames() funktinoniert nicht richtig Netzwerkprogrammierung 2
Thallius JDBC getConnection kommt nicht zurück Netzwerkprogrammierung 1
KingSquizzi3 Website parsen mit Hilfe von jsoup funktioniert nicht Netzwerkprogrammierung 3
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
P RMI - Neue eigene Instanz für jeden Aufruf auf nicht serialisierbares Objekt - wie? Netzwerkprogrammierung 0
F FTP FTPClient Datei lässt sich nicht öffnen Netzwerkprogrammierung 4
F Reader/ Writer werden nicht geschlossen Netzwerkprogrammierung 2
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
R Socket bei server.accept(); gehts nicht weiter Netzwerkprogrammierung 2
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
G Mail senden funktioniert nicht mit SSL Netzwerkprogrammierung 7
L IText mit Servlets, funktioniert nicht Netzwerkprogrammierung 0
E Gruppenchat: Über HTTPS oder nicht? Netzwerkprogrammierung 5
P nanoHttp upload.html page lädt nicht Netzwerkprogrammierung 4
M Byte Array kommt nicht an Netzwerkprogrammierung 0
X Daten können nicht sofort empfangen werden Netzwerkprogrammierung 1
D TCP Socket funktioniert nicht richtig Netzwerkprogrammierung 3
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
D Socket UDP Client reagiert nicht auf spontane Meldungen Netzwerkprogrammierung 5
C Servlet erstellen klappt nicht Netzwerkprogrammierung 3
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
B Methoden und Konstruktoren von Java.net package werden nicht geladen Netzwerkprogrammierung 2
L Email versenden mit Java funktioniert nicht, Fehlermeldungen: MessagingException & SocketException Netzwerkprogrammierung 10
L Server anpingen (Pingzeit) ?? Pingzeit wird nicht verändert Netzwerkprogrammierung 6
C Portscanner funktioniert nicht! Netzwerkprogrammierung 8
M JSP wird im gesamten Projekt nicht neugeladen Netzwerkprogrammierung 3
B HTTP Webseite unter IP-Addresse nicht aufrufbar - unter Domain schon Netzwerkprogrammierung 9
K Chatprogramm - Server funktioniert nicht Netzwerkprogrammierung 5
A Socket ASCii Zeichen werden nicht per udp übermittelt. please help . Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
H HTTP Header Response kann nicht ausgelesen werden Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben