Я использую TCP в своем приложении. Я столкнулся с проблемой потери данных, даже если закрытие сокета изящно. Вот две примеры программы для репликации сценария.Потеря данных, даже если удаленный сокет изящно закрыт в java
// TCP программа Отправитель непрерывно передает данные
public class TCPClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket soc = new Socket("xx.xx.xx.xx",9999);
OutputStream stream = soc.getOutputStream();
int i=1 ;
while(true) {
System.out.println("Writing "+ i);
stream.write(i++);
stream.flush();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
}
// Сервер TCP/Receiver
public class TCPServer2 {
public static void main(String[] args) throws IOException {
System.out.println("program started");
ServerSocket serverSock = new ServerSocket(9999);
Socket socket =serverSock.accept();
System.out.println("client connected");
InputStream stream = socket.getInputStream();
InputStreamReader reader = null;
reader = new InputStreamReader(stream);
socket.setTcpNoDelay(true);
int n=0;
int i=1;
while (true) {
try {
n = reader.read();
System.out.println("Msg No.: "+n);
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
break;
}
if(i==5) {
System.out.println("closing socket");
socket.close();
//client should get exception while sending 6th msg
break;
}i++;
}
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
}
}
Теперь программа идеально TCPClient должны получить исключение при отправке 6-сообщение, но он получает Исключение при отправке 7-го сообщения. Есть ли способ избежать этой проблемы с потерями данных, помимо использования протоколов высокого уровня и SO_LINGER (задержка помогает в этой программе, но может привести к сбою данных в нескольких других сценариях)?
NB: Эта проблема с потерей сообщения возникает, если мы используем две разные машины Windows. На той же машине он отлично работает.
благодарит @SumitRathi. Ссылка очень полезна, так и ваш ответ. –