Hi,
versuch grad aus über einen Client einen Server ein String aufzudrücken der 30203 zeichen hat und er liest diese nicht komplet! Es kommen nur 24525 Zeichen an.
char[] buffer = new char[30203 ];
int charLength = in.read(buffer, 0, 30203 );
inputLine = new String(buffer, 0, charLength);```
Client verschickt den String korrekt, da ich den vor dem versenden Ausgebe!
Sicher, dass der Client nicht was falsches verschickt (oder z.B. kein flush() macht, bevor der Server liest) ?
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class ReadTest
{
public static void main(String args[]) throws IOException
{
test();
}
public static void test() throws IOException
{
String s = "";
while (s.length() < 30203)
{
s += "x";
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(baos));
bw.write(s.toCharArray());
bw.flush();
bw.close();
byte data[] = baos.toByteArray();
BufferedReader in = new BufferedReader(
new InputStreamReader(
new ByteArrayInputStream(data)));
read(in);
}
public static void read(BufferedReader in) throws IOException
{
char[] buffer = new char[30203 ];
int charLength = in.read(buffer, 0, 30203 );
String inputLine = new String(buffer, 0, charLength);
System.out.println("read "+inputLine.length());
}
}
Danke für die Rückmeldung!
Das einzige was ich anders mache ist die Benutzung eines “PrintWriter”:
Client:
BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
out = new PrintWriter(new OutputStreamWriter(skt.getOutputStream()));
out.print("String ;" + "String ;" + "String ;" + "String
" + "String mit 30203 Zeichen");
out.flush();```
Close führe ich noch nicht aus da eine Antwort erwartet wird!
Server:
```BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(skt.getOutputStream()));
String split[] = Pattern.compile("; ").split(in.readLine());
String modelType = split[0];
String model = split[1];
int paramNumber = Integer.parseInt(split[2]);
String[] param = new String[paramNumber];
for (int i = 0; i < paramNumber; i++) {
param** = split[i + 3];
}
int bufferSize = Integer.parseInt(split[paramNumber + 3]);
char[] buffer = new char[bufferSize];
int charLength = in.read(buffer, 0, bufferSize);
inputLine = new String(buffer, 0, charLength);```
Das meine Strings mit Semikolon getrennt usw. ist ne Vorgabe!
Was mach ich falsch!
Insgesamt fehlt da ja ziemlich viel vom Zusammenhang, und was diese ‚model‘-Sache und die splits usw. dort bedeuten erschließt sich nicht durch draufschauen. Steht ‚skt‘ für „socket“?
aaaaaaeeeeeeeiiiiiiiiooooooouuuuuuu
(eine kleine Vokal-Spende, macht Code lesbarer )
Versuch’ mal den Stream zuzumachen. Ich bin kein Netzwerk-Experte, aber könnte es nicht sein, dass dort etwas gepuffert wird, und z.B. nur „pakete“ mit einer bestimmten Größe tatsächlich verschickt werden? Dass er quasi wartet, bis er z.B. 1024 bytes zusammen hat, damit die dann als ein Paket rausgeschickt werden?
Ein KSKB würde natürlich immer helfen…
klappt nun mit:
int read =0;
while ( (pos < bufferSize) && ((read = in.read(buffer, pos, (bufferSize-pos)))!= -1) ) {
pos+=read;
}
inputLine += new String(buffer, 0, pos);```
Danke!
siehe:
http://www.java-forum.org/java-basics-anfaenger-themen/116583-buffer-size.html