PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sockets: Daten werden nicht verschickt



chrigu
02-05-2009, 13:10
Hallo,
Ich muss zwischen einem Client und einem Server beliebige Byte-Streams hin und her schicken.
Komischerweise sendet der Client die Daten erst, wenn ich das Programm beende, oder den Stream explizit schliesse.
Kann mir jemand weiterhelfen?

Client


package test;

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {

public static void main(String[] args) throws UnknownHostException, IOException {

Socket socket = new Socket("localhost", 55555);
PrintStream out = new PrintStream(socket.getOutputStream(), true);

while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}

byte[] stream = "hallo".getBytes();

out.write(stream);
out.flush();

}

}

}



Server


package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(55555);
Socket socket = serverSocket.accept();

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));


while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {}

if (in.ready()) {

byte[] stream = in.readLine().getBytes();
System.out.println(new String(stream));
}

}

}

}



Grüsse,
Chrigu

anda_skoa
02-05-2009, 13:35
Ich vermisse in deinem Sendecode das Newline am Ende des Strings, bzw. die Benutzung von writeln().

Oder dein Empfangscode geht fälschlicherweise davon aus, dass der Client Zeilen sendet.

Ciao,
_

chrigu
02-05-2009, 15:58
Ich vermisse in deinem Sendecode das Newline am Ende des Strings, bzw. die Benutzung von writeln().
Genau, das verflixte Newline!
Eine writeln-Funktion gibt es leider nicht.
Es reicht aber, wenn man einfach noch das Newline mitschickt!



this.out.write(out);
this.out.write("\n".getBytes());

anda_skoa
03-05-2009, 08:41
Genau, das verflixte Newline!
Eine writeln-Funktion gibt es leider nicht.


Mein Fehler: println()

Allerdings ist das für deine Aufgabenstellung ohnehin irrelevant, für beliebige Bytestreams kannst du diese Form des I/O (zeilenorientiert) ohnehin nicht verwenden.

Ciao,
_