Есть ли способ обеспечить надежную связь (отправителю сообщают, что отправленное сообщение уже получено получателем), используя библиотеку Java TCP / IP в java.net. *? Я понимаю, что одним из преимуществ TCP над UDP является его надежность. Тем не менее, я не мог получить такую уверенность в эксперименте ниже:
Я создал два класса:
1) echo server => всегда отправляет обратно полученные данные.
2) client => периодически отправлять эхо-серверу сообщение «Hello world».
Они запускались на разных компьютерах (и работали отлично). Во время выполнения я отключил сеть (отключил кабель локальной сети). После отключения сервер все еще ожидает данные, пока не пройдет несколько секунд (в конечном итоге возникло исключение). Аналогичным образом, клиент также продолжает отправлять данные до тех пор, пока не пройдет несколько секунд (возникает исключение).
Проблема в том, что objectOutputStream.writeObject(message)
не гарантирует статус доставки сообщения (я ожидаю, что оно заблокирует поток, продолжит повторную отправку данных до доставки). Или, по крайней мере, мне сообщают, какие сообщения отсутствуют.
Код сервера:
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();
}
}
}
Код клиента:
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();
}
}
}