Socket解釋:
網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。
Socket的英文原義是“孔”或“插座”。作為BSD UNIX的進程通信機制,取后一種意思。通常也稱作"套接字",用於描述IP地址和端口,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不同的端口對應於不同的服務。Socket正如其英文原意那樣,像一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務。

socket交互原理圖解
連接過程:
(1)服務器監聽:是服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態。
(2)客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和
端口號,然后就向服務器端套接字提出連接請求。
(3)連接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把
服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端
套接字繼續處於
監聽狀態,繼續接收其他客戶端套接字的連接請求。

socket連接過程圖解
下面是我用socket實現簡單的服務器客戶端交互demo:
Server端:
1 try { 2 //創建綁定到特定端口的服務器套接字 3 ServerSocket serverSocket=new ServerSocket(9999); 4 System.out.println("***服務器即將啟動,等待客戶端鏈接***"); 5 //偵聽並接受到此套接字的連接 6 Socket socket=serverSocket.accept(); 7 //獲取輸入流 8 InputStream is=socket.getInputStream(); 9 //將字節輸入流轉為字符輸入流 10 InputStreamReader isr=new InputStreamReader(is); 11 BufferedReader br=new BufferedReader(isr); 12 String str=null; 13 while((str=br.readLine())!=null){ 14 System.out.println("服務器說:客戶端發送了:"+str); 15 br.readLine(); 16 } 17 //此套接字的輸入流置於"流的末尾" 18 socket.shutdownInput(); 19 br.close(); 20 isr.close(); 21 is.close(); 22 } catch (IOException e) { 23 e.printStackTrace(); 24 }
Client端:
1 try { 2 Socket socket=new Socket("127.0.0.1",9999); 3 OutputStream os=socket.getOutputStream(); 4 PrintWriter print=new PrintWriter(os); 5 print.write("你好啊!服務器!"); 6 print.close(); 7 os.close(); 8 } catch (Exception e) { 9 e.printStackTrace(); 10 }
首先需要啟動服務器端,創建ServerSocket等待客戶端連接:
然后,啟動客戶端:
這樣,一個簡單的Socket通信就實現了!