在前面day6有稍微提到IOException,今天在做多一點的延伸學習
回顧一下
IO 是 Input / Output 的縮寫,意思是:
輸入(Input)與輸出(Output)資料的操作
在電腦或 Java 裡,只要是「從某個地方讀資料」或「寫資料到某個地方」,都叫 I/O 操作。
IOException 基本 I/O 例外 所有 I/O 相關錯誤都可能丟出它
FileNotFoundException 檔案不存在或無法打開 FileReader / FileInputStream
EOFException 遇到檔案結尾還繼續讀取 DataInputStream 讀檔案
InterruptedIOException I/O 被中斷 網路傳輸中或多執行緒被打斷
SocketException 網路 Socket 發生錯誤 Socket 連線錯誤
UnknownHostException 無法解析主機名稱 連線到不存在的 host
MalformedURLException URL 格式錯誤 使用 URL /
HttpURLConnection
public class Day9Demo {
public static PortStatus checkPort(String host, int port) {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(host, port), 2000);
socket.close();
return PortStatus.OPEN;
}catch(ConnectException e){
System.out.println("ConnectException: 目標 port 未開");
return PortStatus.CLOSED;
}catch (SocketTimeoutException e){
System.out.println("SocketTimeoutException: 連線超時");
return PortStatus.TIMEOUT;
}catch(UnknownHostException e){
System.out.println("UnknownHostException: 無法解析主機");
return PortStatus.CLOSED;
}catch (IOException e) {
System.out.println("IOException: 其他 I/O 錯誤");
return PortStatus.CLOSED;
}
}
public static void main(String[] args) {
String host = "localhost";
int[] ports = {22, 80, 8080, 9999};
for (int port : ports) {
PortStatus status = checkPort(host, port);
System.out.println("port:" + port + "狀態" + status);
}
}
}
今天這段程式碼的功能就是 掃描某台主機的指定 port 是否開放。
主機:host = "localhost"(也就是我的電腦自己)
要掃描的 port:22, 80, 8080, 9999
每個 port 的狀態:
OPEN → 這個 port 可以連線
CLOSED → port 未開
TIMEOUT → 連線超時,可能被防火牆擋住或網路不通
main 先定義主機與 port 清單
用 for-each 迴圈遍歷每個 port
對每個 port 呼叫checkPort(host, port):
嘗試建立 socket 連線
根據連線結果回傳 PortStatus
印出每個 port 的狀態到 console
今天更詳細的學到IOException與子類別怎麼做使用
也學到超簡易Port Scanner(掃描目標電腦哪些服務在運行)
然後自動檢查指定主機的多個 port 是否開啟,並回報每個 port 的狀態,同時練習 Java 的網路程式與例外處理。