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)
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:
Client:
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ß )
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
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ß )
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