技術理論-【socket】- 計算機網絡

背景知識

  • 計算機網絡

  • 互聯網
    在這裏插入圖片描述

  • 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();
		
	}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章