Java中網絡通信是通過Socket實現的。
Socket分為ServerSocket和Socket兩大類。
ServerSocket用于服務端,通過accept方法監聽請求,監聽到請求后返回Socket,Socket用于具體完成數據傳輸;客戶端通過Socket直接發起請求并傳輸數據。
ServerSocket的使用方法:
- 創建ServerSocket。ServerSocket有5個構造方法,其中ServerSocket(int port)用起來最方便,只需一個端口號就可以了。
- 調用accept方法進行監聽。accept方法是阻塞方法,即調用accept方法后程序會停下來等待請求,在接收到請求之前,程序不會往下走,當接收到請求后accept方法會返回一個Socket.
- 使用accept返回的Socket進行通信。
ServerSocket的簡單示例:
package Ex;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TestServer {
public static void main(String[] args) {
try {
// 1.創建一個ServerSocket監聽8080端口
ServerSocket server = new ServerSocket(8080);
// 2.等待請求
Socket socket = server.accept();
// 3.接收到請求后使用socket進行通信,創建BufferedReader用于讀取數據
BufferedReader is = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String line = is.readLine();
System.out.println("received from client: " + line);
// 創建PrintWriter,用于發送數據
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.println("received data :" + line);
pw.flush();
// 關閉資源
pw.close();
is.close();
socket.close();
server.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
在上面的TestServer中,先創建ServerSocket,然后調用accpet等待請求,當接收到請求后,用返回的Socket創建BufferedReader和PrintWriter進行接收和發送數據,Reader接收到的數據保存到line中,在控制臺打印,Writer發送數據給客戶端。數據傳輸完成后,關閉連接;
Socket的簡單示例:
package Ex;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class TestClient {
public static void main(String[] args) {
String msg = "Client Data.";
try {
//創建一個Socket,跟本機的8080端口連接
Socket socket = new Socket("127.0.0.1",8080);
//使用Socket創建PrintWriter和BufferedReader進行讀寫數據
PrintWriter pw = new PrintWriter(socket.getOutputStream());
//讀取數據
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//發送數據
pw.println(msg);
pw.flush();
//接收數據
String line = is.readLine();
System.out.println("received from server :"+line);
//關閉資源
is.close();
pw.close();
socket.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
首先創建一個Socket,采用Socket(String host,int port)構造方法,把主機地址和端口號傳入進去,Socket就會跟服務端建立連接,創建完Socket,再創建Reader和Writer進行數據傳輸,數據傳輸完成后,關閉連接釋放資源即可。
??先啟動TestServer,然后再啟動TestClient就可以完成一次通信。Server端控制臺輸出:received from client:Client Date;Client端控制臺輸出:received from server:received data:Client data;