Java網路程式設計由淺入深二 Socket的建構和連接服務端的相關異常 的詳細介紹
Socket建構方法與Socket的設定與例外
本文將介紹Socket的建構方法與Socket的相關屬性設定與例外處理
#建構Socket
#設定等待逾時時間
##設定伺服器位址
設定客戶端位址
客戶端連線伺服器可能出現的例外
建構Socket
Socket的建構方法有下列幾種重載方式:Socket();Socket(InetAddress address, int port)Socket(InetAddress address, int port, InetAddress localAddr, int localPort)Socket(Proxy proxy)Socket(SocketImpl impl)Socket(String host, int port) Socket(String host, int port, InetAddress localAddr, int localPort)
如下程式碼掃描主機上從1到1024之間的端口,判斷這些端口是否已經被伺服器程式監聽。
public class PortScanner { public static void main(String[] args) { String host = "localhost"; new PortScanner().scan(host); } public void scan(String host){ Socket socket = null; for(int i=0;i<1024;i++){ try { socket = new Socket(host, i); System.out.println("There is a server on port "+i); } catch (IOException e) { System.out.println("Can't connect to port "+i); }finally{ if(socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } }
設定等待建立連線的逾時時間
使用不含參數的建構方法,設定socket連線逾時時間:Socket socket = new Socket(); SocketAddress endPoint = new InetSocketAddress("localhost", 8000);socket.connect(endPoint, 60000);
SocketTimeoutException。
socket. connect(SocketAddress endpoint, int timeout);負責連接伺服器,參數endpoint指定伺服器位址,參數timeout設定逾時時間,以毫秒為單位。如果參數timeout為0,表示永遠不逾時。
設定伺服器位址
Socket的建構方法中,除了第一個不帶參數的建構方法,其他建構方法都需要指定伺服器位址,包括伺服器的IP或主機名,以及連接埠:Socket(InetAddress address, int port)
Socket(String host, int port)
InetAddress類別表示伺服器的IP位址,InetAddress提供了許多靜態方法:
// 返回本地主机的IP地址 InetAddress.getLocalHost(); // 返回代表10.202.164.65的IP地址 InetAddress.getByName("10.202.164.65"); // 返回域名为'www.csdn.net'的ip地址 InetAddress.getByName("www.csdn.net");
設定客戶端的位址:
預設情況下,客戶端的IP位址來自於客戶端程式所在的主機,而客戶端的連接埠則由作業系統隨機分配。但是Socket類別還是提供了建構方法允許明確設定客戶端的IP和連接埠://参数localAddr和localPort用来设置客户端的IP和端口。 Socket(InetAddress address, int port, InetAddress localAddr, int localPort) Socket(String host, int port, InetAddress localAddr, int localPort)
客戶端連接伺服器可能拋出的異常
當Socket構造當方法要求連接伺服器時,可能會拋出下面的例外:• UnknownHostException:如果無法辨識主機的名字或IP位址,就會拋出這種例外
public class ConnectTester { public static void main(String[] args) { String host = "www.csdn.net"; int port = 12312; new ConnectTester().connect(host, port); } public void connect(String host,int port){ SocketAddress remoteAddress = new InetSocketAddress(host, port); Socket socket = null; String result = null; try{ socket = new Socket(); long start = System.currentTimeMillis(); socket.connect(remoteAddress,1000); long end = System.currentTimeMillis(); result = (end-start)+"ms"; }catch(BindException bindException){ result = "BindException,Socket对象与指定的本地IP地址或端口绑定,异常"; }catch (UnknownHostException unknownHostException) { result = "UnknownHostException,无法识别的主机"; }catch (ConnectException connectException) { result = "ConnectException,连接被拒绝"; }catch (SocketTimeoutException socketTimeoutException) { result = "SocketTimeoutException,连接超时"; }catch(IOException e){ result = "IOException,连接失败"; }finally{ if(socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } System.out.println(remoteAddress+" : "+result); } }
如果無法辨識主機的名字或IP位址,就會拋出這個例外。例如:host為:’ somehost11’。 Socket的connect方法就會拋出UnknownHostException異常。
• 拋出ConnectException的情況:
在以下兩種情況會拋出ConnectException。
1) 沒有伺服器程序監聽指定的連接埠。例如:host為 ‘localhost’ port為 12321 。如果本機的12321埠沒有被任何進程監聽,則Socket連線方法會拋出ConnectException。
2) 伺服器程序拒絕連線。介紹伺服器程序拒絕客戶的連線請求的情形。如下範例程式碼,一個簡單的服務程式ServerSocket建構方法中的第二個參數表示請求佇列的長度。如果佇列的請求已滿,伺服器就會拒絕其餘的請求。拋出ConnectException
public class SimplServer { public static void main(String[] args) throws Exception{ ServerSocket serverSocket = new ServerSocket(8888, 2); Thread.sleep(3600000); } }
public class SimpleClient { public static void main(String[] args) throws Exception{ String host = "localhost"; int port = 8888; Socket s1 = new Socket(host, port); System.out.println("第一次连接成功"); Socket s2 = new Socket(host, port); System.out.println("第二次连接成功"); Socket s3 = new Socket(host, port); System.out.println("第三次连接成功"); } }
如果客戶端連線逾時,就會拋出這種例外。修改
socket.connect(remoteAddress, 1);由原來的1000毫秒修改為1毫秒,這樣增加了超時的可能性。
將程式碼
socket = new Socket();socket.connect(remoteAddress, 1000);
socket = new Socket(); socket.bind(new InetSocketAddress(InetAddress.getByName("222.34.5.6"), 5678)); socket.connect(remoteAddress, 1000);
#

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

直接在手機上將XML轉換為PDF並不容易,但可以藉助雲端服務實現。推薦使用輕量級手機App上傳XML文件並接收生成的PDF,配合雲端API進行轉換。雲端API使用無服務器計算服務,選擇合適的平台至關重要。處理XML解析和PDF生成時需要考慮複雜性、錯誤處理、安全性和優化策略。整個過程需要前端App與後端API協同工作,需要對多種技術有所了解。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。
