Gibt es eine Möglichkeit, eine zuverlässige Kommunikation (der Sender wird informiert, dass die gesendete Nachricht bereits vom Empfänger empfangen wurde) mit der Java TCP/IP-Bibliothek in java.net.* zu erreichen? Ich weiß, dass einer der Vorteile von TCP gegenüber UDP seine Zuverlässigkeit ist. Dennoch konnte ich diese Gewissheit in dem folgenden Experiment nicht erlangen:
Ich habe zwei Klassen erstellt:
1) Echo-Server => sendet immer die Daten zurück, die er empfangen hat.
2) Client => sendet in regelmäßigen Abständen die Nachricht "Hello world" an den Echo-Server.
Sie wurden auf verschiedenen Computern ausgeführt (und funktionierten einwandfrei). Mitten in der Ausführung trennte ich das Netzwerk (zog das LAN-Kabel ab). Nachdem die Verbindung getrennt wurde, wartete der Server immer noch auf Daten, bis einige Sekunden vergangen waren (schließlich löste er eine Ausnahme aus). Ebenso sendet der Client weiterhin Daten, bis ein paar Sekunden vergangen sind (eine Ausnahme wird ausgelöst).
Das Problem ist, objectOutputStream.writeObject(message)
garantiert nicht den Zustellungsstatus der Nachricht (ich erwarte, dass es den Thread blockiert und die Daten erneut sendet, bis sie zugestellt sind). Oder ich werde zumindest darüber informiert, welche Nachrichten fehlen.
Server-Code:
import java.net.*;
import java.io.*;
import java.io.Serializable;
public class SimpleServer {
public static void main(String args[]) {
try {
ServerSocket serverSocket = new ServerSocket(2002);
Socket socket = new Socket();
socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
ObjectInputStream objectInputStream = new ObjectInputStream(
inputStream);
while (true) {
try {
String message = (String) objectInputStream.readObject();
System.out.println(message);
Thread.sleep(1000);
} catch (Exception ex) {
ex.printStackTrace();
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Client-Code:
import java.net.*;
import java.io.*;
public class SimpleClient {
public static void main(String args[]) {
try {
String serverIpAddress = "localhost"; //change this
Socket socket = new Socket(serverIpAddress, 2002);
OutputStream outputStream = socket.getOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
outputStream);
while (true) {
String message = "Hello world!";
objectOutputStream.writeObject(message);
System.out.println(message);
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}