摘要:在Java SDK中,對于Socket原生提供了支援,它分為ServerSocket和Socket。
本文分享自華為雲社群《Java Socket 如何實作伺服器和用戶端資料互動》,作者: jackwangcumt 。
根據百度百科的定義,Socket 譯為套接字,它是對網絡中不同主機上的應用程序之間進行雙向通信的端點的抽象。一個Socket執行個體就是網絡上程序通信的一端,提供了應用層程序利用網絡協定交換資料的機制。Socket向上連接配接各種應用程序,向下連接配接各種網絡協定,是應用程式通過網絡協定進行通信的接口。其示意圖如下下圖所示:

(來自《Java TCP/IP Socket程式設計》)
從上圖可知,套接字Socket在OSI七層模型中處于應用層和傳輸層之間,是一個重要的接口。一般來說,傳輸層協定有TCP協定和UDP協定。這兩個協定底層都基于IP網絡層協定。
在Java SDK中,對于Socket原生提供了支援,它分為ServerSocket和Socket,其中ServerSocket發起一個服務端的Socket,其中需要提供一個端口号,如果給定0,則自動申請可用的端口。當然了,也可以指定具體的端口号(有一定的範圍,不超過 65535 )。不過這裡需要注意,傳入的端口不能被其他應用占用,否則啟動服務失敗。下面給出一個簡單的ServerSocket示例,代碼如下:
啟動該Server端,并開始監聽用戶端的連接配接。當用戶端沒有連接配接時,伺服器線程池pool并未啟動單獨的線程。下面給出用戶端的Java Socket實作,具體的示例代碼如下:
從代碼可知,try (Socket socket = new Socket(IP, PORT)) 是一種包含資源釋放的try-with-resource機制,它會自動進行資源釋放,而不需要手動進行釋放。Socket對象要想和伺服器通信,必須要明确伺服器的IP位址和端口,否則不能正确通信,Socket啟動時,也會在主機上占用自己的端口。我們首先啟動Server端,然後可以同時啟動10個以上的Client端,比如13個,那麼超過Executors.newFixedThreadPool(10)限定的數量10後,将進入queued tasks隊列中進行排隊等待。通過列印pool對象,可以看出目前的狀态,比如[Running, pool size = 4, active threads = 4, queued tasks = 0, completed tasks = 0]說明目前在運作狀态,線程池大小為10,激活的線程為10,等待的任務線程queued tasks為0。
下面給出Server端相關輸出示例:
用戶端相關輸入輸出界面如下:
點選關注,第一時間了解華為雲新鮮技術~