我在我的应用程序中使用 TCP。即使优雅地关闭套接字,我也面临数据丢失问题。这是复制场景的两个示例程序。
//TCP Sender程序不断发送数据
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 服务器/接收器
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 之外,还有什么方法可以避免这种数据丢失问题(linger 在这个程序中确实有帮助,但它可能会在其他几种情况下导致数据丢失问题)?
注意:如果我们使用两台不同的 Windows 机器,则会出现此消息丢失问题。在同一台机器上它工作正常。