在java.net中使用Java TCP/IP庫,是否有一種方法可以實現可靠的通信(發送方得到接收方已發送的消息)?我知道TCP over UDP的優點之一就是它的可靠性。然而,我不能讓這種保證在下面的實驗:Java中的可靠TCP/IP
我創建了兩個類:
1)回聲服務器=>總是發送回它接收到的數據。
2)client =>週期性地向echo服務器發送「Hello world」消息。
他們在不同的計算機上運行(並完美地工作)。在執行過程中,我斷開了網絡連接(拔掉了LAN電纜)。斷開連接後,服務器仍然在等待數據,直到數秒後(它最終引發異常)。同樣,客戶端也會一直髮送數據直到數秒過去(引發異常)。
問題是,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();
}
}
}
那麼,如何檢測斷開連接時丟失哪些消息? –
當客戶端連接到服務器時,您可以使用TCP握手,說明上次發送了多少。在TCP傳輸開始之前,您應該傳輸文件大小。這就是HTTP下載的工作方式,您可以在這裏恢復傳輸。客戶也知道他們的轉移並不完整。 –
這是錯誤的,請參閱http://stackoverflow.com/questions/6939204/reliable-tcp-ip-in-java#comment14181788_6939281 – schlamar