我正在用Java寫一個簡單的TCP客戶端/服務器程序對,如果客戶端在10秒內沒有發送任何東西,服務器必須斷開連接。 socket.setSoTimeout()讓我,服務器斷開連接就好了。問題是 - 我如何讓客戶端確定服務器是否關閉?目前我使用DataOutputStream來寫入服務器,並且在這裏的一些答案表明,寫入一個封閉的套接字將拋出一個IOException,但是這不會發生。TCP從客戶端檢測斷開的服務器
應該使用什麼樣的編寫器對象將任意字節塊發送到服務器,這會拋出異常或以其他方式指示連接已遠程關閉?
編輯:這是客戶端代碼。這是一個測試功能,它從文件系統讀取一個文件並將其發送到服務器。它以塊的形式發送,並在每個塊之間暫停一段時間。
public static void sendFileWithTimeout(String file, String address, int dataPacketSize, int timeout) {
Socket connectionToServer = null;
DataOutputStream outStream = null;
FileInputStream inStream = null;
try {
connectionToServer = new Socket(address, 2233);
outStream = new DataOutputStream(connectionToServer.getOutputStream());
Path fileObject = Paths.get(file);
outStream.writeUTF(fileObject.getFileName().toString());
byte[] data = new byte[dataPacketSize];
inStream = new FileInputStream(fileObject.toFile());
boolean fileFinished = false;
while (!fileFinished) {
int bytesRead = inStream.read(data);
if (bytesRead == -1) {
fileFinished = true;
} else {
outStream.write(data, 0, bytesRead);
System.out.println("Thread " + Thread.currentThread().getName() + " wrote " + bytesRead + " bytes.");
Thread.sleep(timeout);
}
}
} catch (IOException | InterruptedException e) {
System.out.println("Something something.");
throw new RuntimeException("Problem sending data to server.", e);
} finally {
TCPUtil.silentCloseObject(inStream);
TCPUtil.silentCloseObject(outStream);
TCPUtil.silentCloseObject(connectionToServer);
}
}
我希望outStream.write在嘗試寫入封閉的服務器時拋出一個IOException,但沒有任何結果。
_「但那不會發生」_。那麼當服務器關閉時會發生什麼? – CHOCKO
您的客戶端輸入流將指示服務器關閉套接字時該流已關閉。如果您碰巧在服務器同時關閉套接字的情況下寫入輸出流,則還應該發生異常。不知道爲什麼你沒有得到例外。你能顯示一些代碼嗎? – anonymous
@CHOCKO - 沒有任何東西。客戶端將數據寫入流並正常退出,而不關心服務器不再存在讀取數據。 – kjerins