1.Socket原理
1)Socket簡介
socket通常稱作“套接字”,用於描述IP地址和端口號,是一個通信鏈的句柄。在Internet上的主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不同的端口對應不同的服務。應用程序通常通過“套接字”向網絡發出請求或者應答網絡請求。Socket和ServerSocket類庫位於java.net包中。ServerSocket用於服務端,Socket是簡歷網絡連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話。
2)獲取本地地址和端口號
- 獲取本地使用的端口號
int getLocalPort() 返回類型為int
- 獲取套接字綁定的本地地址
InetAddress getLocalAddress()
- 使用InetAddress獲取本地的地址方法
String getCanonicaHostName() 返回類型為String
- 獲取此IP地址的完全限定域名
String getHostAddress() 返回類型為String
3)獲取遠端地址和端口號
- Socket獲取遠端端口號方法
int getPort() 返回類型為int
- 獲取遠端套接字綁定的遠端地址
InetAddress.getInetAddress()
案例1:Socket獲取IP、端口信息
1.設置服務端,以本機作為服務器端演示
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketDemo {
public static void main(String[] args) {
ServerSocket server;
try {
server = new ServerSocket(8080); //創建ServerSocket並申請8080服務端口
Socket socket = server.accept(); //阻塞方法,監聽服務端口,等待客戶端的鏈接並返回一個socket實例
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.設置客戶端,以本機作為客戶端演示
客戶端設置完成后,先啟動服務端,然后啟動客戶端去連接服務端,連接成功之后可以看到輸出本端與遠端的IP和端口信息
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
public class SocketInetAddressDemo {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost",8080);
//獲取本地使用的端口號
int port = socket.getLocalPort();
System.out.println("本地使用端口號:"+port);
InetAddress add = socket.getLocalAddress(); //獲取本地地址信息
//使用InetAddress獲取本地地址
String hostname = add.getCanonicalHostName();
System.out.println("本地地址:"+hostname);
//獲取此IP的完全限定域名
String hostadd = add.getHostAddress();
System.out.println("限定域名:"+hostadd);
//獲取遠端的端口號
int desPort = socket.getPort();
System.out.println("遠端端口號:"+desPort);
//獲取遠端IP
InetAddress inetAdd = socket.getInetAddress();
System.out.println(inetAdd);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
運行結果:
本地使用端口號:62565
本地地址:127.0.0.1
限定域名:127.0.0.1
遠端端口號:8080
localhost/127.0.0.1
*/
4)獲取網絡輸入流和網絡輸出流
使用Socket獲取輸入流與輸出流,這兩個方法使用Socket通訊的關鍵方法,封裝了TCP協議的Socket是基於流進行通訊的,所以我們在創建了雙方連接后,只需要獲取相應的輸入流與輸出流即可實現通訊。
- 返回此套接字的輸入流
InputStream getInputStream()
- 返回此套接字的輸出流
OutputStream.getOutputStream()
具體代碼示例:
public void testSocket() throws Exception{
Socket socket = new Socket("localhost",8080);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
}
5)close方法
當使用Socket進行通訊完畢后,要關閉Socket以釋放系統資源。
void close()
2.Socket通訊模型
1)Server端ServerSocket監聽
java.net.ServerSocket是運行於服務端應用程序中,通常創建ServerSocket需要指定服務端口號,之后監聽Sokcet的連接,監聽方法為:
Socket accept()
該方法是一個阻塞方法,直到一個客戶端通過Socket連接后,accept會封裝一個Socket,該Socket封裝與表示該客戶端的有關的信息,通過這個Socket與該客戶端進行通信。
//創建ServerSocket並申請服務端口8080 ServerSocket server = new ServerSocket(8080); //accept()方法會產生阻塞,直到某個Socket連接並返回請求連接的Socket Socket socket = server.accept();
2)Client端Socket連接
當服務端ServerSocket調用accept方法阻塞等待客戶端連接后,我們可以通過在客戶端應用程序中創建Socket來向服務端發起連接。
需要注意的是:創建Socket的同時就發起連接,若連接異常會拋出異常,我們通常創建Socket時會傳入服務端的地址以及端口號。
//參數1:服務器的IP地址 參數2:服務端的服務端口號
Socket socket = new Socket("localhost",8080);
3)C/S端通信模型
C/S即:Client-Server,客戶端到服務端
客戶端與服務端通信模型如下:

- 服務端創建ServerSocket
- 通過調用ServerSocket的accept方法監聽客戶端的連接
- 客戶端創建Socket並指定服務端的地址以及端口來建立與服務端的連接
- 當服務端accept發現客戶連接后,獲取對應該客戶端的Socket
- 雙方通過Socket分別獲取對應的輸入與輸出流進行數據通訊
- 通訊結束后關閉連接
