背景知識
-
計算機網絡
-
互聯網
-
IP
-
端口
-
URL
-
B/S,C/S
-
分層
- ISO標準(物理,數據鏈路,網絡,傳輸,會話,表示,應用)
- TCP/IP協議集(網絡接口,網絡層、傳輸層、應用層)
-
應用層:HTTP、FTP、DNS、SMTP、Telnet
-
傳輸層:TCP、UDP
-
數據包
知識點
- HTTP
- InetAddress
- InetSocketAddress
- URL
- HttpURLConnection
- TCP協議
- ServerSocket
- Socket
- UDP協議
- DatagramPacket
- DatagramSocket
命題
- 計算機網絡是計算機之間建立的通信網絡。
- 通信網絡是個體之間傳遞信息的網絡,比如郵政網絡、快遞網絡、手機網絡。
- 計算機信息是通過網絡設備進行傳輸。
- 計算機信息是二進制的數字信息。
- 計算機在網絡中需要用IP作爲身份標識。
- 計算機中有多個應用,端口是應用在網絡中的標識。
- 應用擁有多個資源,URI是應用資源的標識。
- URI(統一資源標誌符)分爲URL(統一資源定位符)和URN(統一資源名稱)。
- 計算機網路分爲局域網和互聯網。
- 局域網是封閉的私有網絡,私有IP。
- 互聯網是開放的公共網絡,共有IP。
- 網絡中傳輸的是數據包,類似於快遞包裹。
- 數據包傳輸過程需要底層網絡設備支持,比如網線、集線器、路由器。
- 數據傳輸必須保證數據的完整性,就要求網絡可用性、高效性、穩定性,所以將傳輸過程通過分層進行解耦,分層來解決可用性、高效性、穩定性、完整性。
- 網絡使用的TCP/IP分層方案。
- 應用開發者只關心傳輸層和應用層。
- 傳輸層負責數據包的傳遞工作,類似於快遞公司,只負責運輸過程,不關心包裹內容。
- 傳輸層的工具是socket,有TCP和UDP兩種傳輸協議。
- 應用層負責數據內容規範,類似於信件格式,不同信件,格式不同。
- 互聯網三大基石:HTTP、HTML、URL。
- TCP傳輸是安全的,保證數據一定能傳遞成功,代價是佔用資源多、性能低。
- UDP傳輸是不安全的,只負責數據發送,不關心接收情況,優點是佔用資源少,性能高,代價是可能丟包。
實際案例
- 信息訂閱
- 點對點傳輸
- 聊天室
- 爬蟲
代碼案例
TCP-server
/**
* TCP服務器端,接收和處理客戶端信息
* 1、創建服務器socket對象,ServerSocket,偵聽1003端口
* 2、偵聽端口,
* 3、準備輸入和輸出對象
* 4、輸入對象讀取客戶端消息
* 5、輸出對象返回消息
* 6、釋放資源
*
* @author jeadong
*
*/
public class TcpServer {
public static void main(String[] args) throws Exception {
// * 1、創建服務器socket對象,ServerSocket,偵聽1003端口
ServerSocket serverSocket = new ServerSocket(1003);
// * 2、偵聽端口
System.out.println("服務器接收消息中...");
Socket socket = serverSocket.accept();
// * 3、準備輸入和輸出對象
DataInputStream reader = new DataInputStream(socket.getInputStream());
// * 4、輸入對象讀取客戶端消息
System.out.println("收到客戶端消息,準備處理...");
System.out.println("client:"+reader.readUTF());
// * 5、輸出對象返回消息
DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
writer.writeUTF("收到!");
writer.flush();
// * 6、釋放資源
reader.close();
writer.close();
socket.close();
serverSocket.close();
}
}
TCP-client
/**
* TCP客戶端,向服務器發送消息
* 1、創建socket對象,指定服務器IP+端口
* 2、準備輸入和輸出對象
* 3、發送消息
* 4、接收消息
* 5、釋放資源
*
* @author jeadong
*
*/
public class TcpClient {
public static void main(String[] args) throws Exception {
// * 1、創建socket對象,指定服務器IP+端口、
Socket socket = new Socket(InetAddress.getLocalHost(),1003);
// * 2、準備輸入和輸出對象
DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
// * 3、發送消息
System.out.println("客戶端準備發送消息...");
writer.writeUTF("hello server!");
writer.flush();
System.out.println("發送消息結束");
// * 4、接收消息
System.out.println("準備接收服務器反饋...");
DataInputStream reader = new DataInputStream(socket.getInputStream());
System.out.println("server:"+reader.readUTF());
// * 5、釋放資源
reader.close();
writer.close();
socket.close();
}
}
UDP-server
/**
* 消息推送者:給訂閱者推送消息
* 1、創建UDP消息發送socket對象,發送端口1002,DatagramSocket
* 2、準備發送信息內容
* 3、創建發送消息容器,DatagramPacket
* 4、準備發送地址
* 5、發送消息
*
* @author jeadong
*
*/
public class UdpServer {
public static void main(String[] args) throws Exception {
// * 1、創建UDP消息發送socket對象,發送端口1002,DatagramSocket
DatagramSocket socket = new DatagramSocket(1002);
// * 2、準備發送信息內容
byte[] b = "hello world!".getBytes();
// * 3、創建接受消息容器,DatagramPacket
DatagramPacket packet = new DatagramPacket(b,b.length);
// * 4、準備發送地址
packet.setSocketAddress(new InetSocketAddress("localhost", 1001));
// * 5、發送消息
System.out.println("消息推送者,準備推送信息...");
socket.send(packet);
System.out.println("消息推送者,推送信息完成。");
socket.close();
}
}
UDP-client
/**
* 消息訂閱者:接收服務器推送消息
* 1、創建UDP消息接收socket對象,接收端口1001,DatagramSocket
* 2、創建接收消息容器,DatagramPacket
* 3、接收消息
* 4、收到消息
*
* @author jeadong
*
*/
public class UdpClient {
public static void main(String[] args) throws Exception {
// * 1、創建UDP消息接收對象,接收端口1001,DatagramSocket
DatagramSocket socket = new DatagramSocket(1001);
// * 2、創建接收消息容器,DatagramPacket
byte[] b = new byte[1024];
DatagramPacket packet = new DatagramPacket(b,b.length);
// * 3、接收消息
System.out.println("消息訂閱者,接收消息中...");
socket.receive(packet);
// * 4、收到消息
String string = new String(packet.getData(),0,packet.getLength());
System.out.println("收到消息:"+string);
socket.close();
}
}