Hallo,
ich möchte einen rudimentären Client erzeugen, der von einem Server Daten abfragt. In der Insel habe ich gelesen, dass ich Blockierungen abfangen sollte. Wenn ich die dortige Lösung richtig verstehe, wird immer 2sec gewartet auch wenn die Antwort ggf. schon eingetroffen ist. Nun dachte ich, dass ich dieses Problem über wait/notify umgehen kann.
Ich hatte gehofft, dass durch this.response.wait(2000); max. 2 Sekunden auf den gestarteten Thread gewartet wird und dann in jedem Fall die Methode fortgesetzt wird. Dies ist aber nicht so. Wenn ich die Antwortzeit des Servers mit einem Thread.sleep(10000); verzögere, wartet mein Client die 10sec und bricht nicht, wie gehofft, nach 2sec ab.
Habe ich einen Denkfehler bei der Verwendung von wait/notify?
Gruß Micha
P.S. seit wann gehen eckige Klammern im Code verloren hier im Forum?
ich möchte einen rudimentären Client erzeugen, der von einem Server Daten abfragt. In der Insel habe ich gelesen, dass ich Blockierungen abfangen sollte. Wenn ich die dortige Lösung richtig verstehe, wird immer 2sec gewartet auch wenn die Antwort ggf. schon eingetroffen ist. Nun dachte ich, dass ich dieses Problem über wait/notify umgehen kann.
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketTest {
private final String uri;
private final int port;
private Socket socket;
private PrintWriter os;
private BufferedReader is;
private final static String AUTHENTIFIKATION = "GET_DATA";
private StringBuffer response = null;
public SocketTest(String uri, int port) {
this.uri = uri;
this.port = port;
}
public boolean open() {
try {
socket = new Socket(uri,port);
os = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
return true;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public void getData() {
this.response = new StringBuffer();
try {
this.sendMessage(AUTHENTIFIKATION);
synchronized (this.response) {
new Thread() {
public void run() {
try {
readMessage();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
// Sollte HIER nicht nach 2sec abgebrochen werden???
if (this.response == null || this.response.length() == 0)
this.response.wait(2000);
System.out.println("Antwort " +response);
}
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
public boolean close() {
try {
if (this.is != null)
this.is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (this.os != null)
this.os.close();
if (this.socket.isClosed())
this.socket.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
private void sendMessage(String message) {
this.os.print(message);
this.os.flush();
}
private void readMessage() throws IOException {
synchronized (response) {
char[] buffer = new char[1024];
int read = this.is.read(buffer, 0, buffer.length); // blockiert bis Nachricht empfangen
this.response.append( new String(buffer, 0, read) );
this.response.notify();
}
}
/**
* @param args
*/
public static void main(String[] args) {
SocketTest socket = new SocketTest("127.0.0.1", 11111);
socket.open();
socket.getData();
socket.close();
}
}
Ich hatte gehofft, dass durch this.response.wait(2000); max. 2 Sekunden auf den gestarteten Thread gewartet wird und dann in jedem Fall die Methode fortgesetzt wird. Dies ist aber nicht so. Wenn ich die Antwortzeit des Servers mit einem Thread.sleep(10000); verzögere, wartet mein Client die 10sec und bricht nicht, wie gehofft, nach 2sec ab.
Habe ich einen Denkfehler bei der Verwendung von wait/notify?
Gruß Micha
P.S. seit wann gehen eckige Klammern im Code verloren hier im Forum?