Java中網(wǎng)絡(luò)通信是通過Socket實(shí)現(xiàn)的援奢。
Socket分為ServerSocket和Socket兩大類蓖谢。
ServerSocket用于服務(wù)端根吁,通過accept方法監(jiān)聽請求片林,監(jiān)聽到請求后返回Socket,Socket用于具體完成數(shù)據(jù)傳輸端盆;客戶端通過Socket直接發(fā)起請求并傳輸數(shù)據(jù)。
ServerSocket的使用方法:
- 創(chuàng)建ServerSocket费封。ServerSocket有5個(gè)構(gòu)造方法焕妙,其中ServerSocket(int port)用起來最方便,只需一個(gè)端口號就可以了弓摘。
- 調(diào)用accept方法進(jìn)行監(jiān)聽焚鹊。accept方法是阻塞方法,即調(diào)用accept方法后程序會停下來等待請求韧献,在接收到請求之前末患,程序不會往下走,當(dāng)接收到請求后accept方法會返回一個(gè)Socket.
- 使用accept返回的Socket進(jìn)行通信锤窑。
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.創(chuàng)建一個(gè)ServerSocket監(jiān)聽8080端口
ServerSocket server = new ServerSocket(8080);
// 2.等待請求
Socket socket = server.accept();
// 3.接收到請求后使用socket進(jìn)行通信璧针,創(chuàng)建BufferedReader用于讀取數(shù)據(jù)
BufferedReader is = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String line = is.readLine();
System.out.println("received from client: " + line);
// 創(chuàng)建PrintWriter,用于發(fā)送數(shù)據(jù)
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.println("received data :" + line);
pw.flush();
// 關(guān)閉資源
pw.close();
is.close();
socket.close();
server.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
在上面的TestServer中,先創(chuàng)建ServerSocket渊啰,然后調(diào)用accpet等待請求探橱,當(dāng)接收到請求后,用返回的Socket創(chuàng)建BufferedReader和PrintWriter進(jìn)行接收和發(fā)送數(shù)據(jù)绘证,Reader接收到的數(shù)據(jù)保存到line中隧膏,在控制臺打印,Writer發(fā)送數(shù)據(jù)給客戶端嚷那。數(shù)據(jù)傳輸完成后胞枕,關(guān)閉連接;
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 {
//創(chuàng)建一個(gè)Socket车酣,跟本機(jī)的8080端口連接
Socket socket = new Socket("127.0.0.1",8080);
//使用Socket創(chuàng)建PrintWriter和BufferedReader進(jìn)行讀寫數(shù)據(jù)
PrintWriter pw = new PrintWriter(socket.getOutputStream());
//讀取數(shù)據(jù)
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//發(fā)送數(shù)據(jù)
pw.println(msg);
pw.flush();
//接收數(shù)據(jù)
String line = is.readLine();
System.out.println("received from server :"+line);
//關(guān)閉資源
is.close();
pw.close();
socket.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
首先創(chuàng)建一個(gè)Socket,采用Socket(String host,int port)構(gòu)造方法曲稼,把主機(jī)地址和端口號傳入進(jìn)去,Socket就會跟服務(wù)端建立連接湖员,創(chuàng)建完Socket,再創(chuàng)建Reader和Writer進(jìn)行數(shù)據(jù)傳輸贫悄,數(shù)據(jù)傳輸完成后,關(guān)閉連接釋放資源即可娘摔。
??先啟動(dòng)TestServer,然后再啟動(dòng)TestClient就可以完成一次通信窄坦。Server端控制臺輸出:received from client:Client Date;Client端控制臺輸出:received from server:received data:Client data;