天天看點

Java學習筆記day23網絡

網絡

什麼是網絡?

概念:由點和線構成,表示多個對象之間互相聯系
計算機網絡:
	網際網路:Internet
	網際網路:WWW(World Wide Web)
	物聯網:IoT(Internet of Things)
	
網絡模型(了解):
	OSI參考模型:
		應用層:如http協定,SMTP協定(郵件)...
		表示層:将資料格式進行傳話與加密.
		會話層:維持通訊
		傳輸層:如恢複通訊,資料流重用等事情.UDP,TCP
		網絡層:ip,計算機在網際網路的位址
		資料鍊路層:對其資料進行格式化的要求
		實體層:硬體裝置,如網線,網線接口等
		
		因為OSI過于理想化,所有沒有被實作
		
	TCP/IP模型
		應用層
			對應OSI模型的應用層,表示層,會話層
			對應的協定:HTTP,SMTP,HTTPS
		傳輸層
			對應OSI模型的傳輸層
			對應的協定:TCP,UDP協定
		網絡層
			對應OSI模型的網絡層
			對應的協定:IP
		網絡接口層
			對應OSI模型的資料鍊路層與實體層
			對應協定:以太網協定,ADSL協定等

網絡程式設計需要什麼?
	IP
	端口号
	通訊協定
           

IP

概念(重點):計算機在網際網路中的位址
IPV4
	4個位元組,每個位元組由8位組成.是以每段的值0~255
		0000 0000 ~ 1111 1111
	192.168.7.151
IPV6
	16個位元組,每個位元組8位組成,每段16位,是以每段取值範圍0~65535
	
檢視目前計算機IP:
	步驟:
		1.打開dos指令框
		2.輸入ipconfig
IP位址的分類:
	A類位址:大型網絡,主要服務于國家與政府企業
	B類位址:中型網絡,主要服務于大型實驗室等
	C類位址:個人網絡,普通人與普通企業用的網絡
	
特殊IP:(重點)
	127.0.0.1表示本機
	因為不好記,是以變為了英文localhost
	專業名稱:回路位址

相關指令:
	ipconfig
		作用:檢視目前計算機的ip資訊
	ping
		作用:嘗試連接配接對方

InetAddress類:
	作用:表示計算機在網絡中的位址
           
package ip;

import java.io.IOException;
import java.net.InetAddress;

public class Test {
	public static void main(String[] args) throws IOException {
		//擷取本機的網絡位址資訊
//		InetAddress ip = InetAddress.getLocalHost();
		//通過主機名擷取别人的位址資訊
		InetAddress ip = InetAddress.getByName("www.baidu.com");
		//通過指定的ip擷取對方的資訊
//		InetAddress ip = InetAddress.getByName("36.152.44.96");
		System.out.println(ip);
		System.out.println(ip.getHostName()); //擷取裝置名稱
		System.out.println(ip.getHostAddress()); //擷取ip位址
	}
}

           

運作結果

Java學習筆記day23網絡

端口

概念:程式在計算機中的位址
範圍:0~65535
	注意:
		0~1023:一般被系統占用
		1024~49151:注冊端口
		49151~65535:動态端口
常見的端口:
	MySQL端口号:3306
	Tomcat端口号:8080
	HTTP協定端口号:80
	Oracle端口号:1521
	Redis端口号:6379
           

通訊協定

TCP
	中文名:傳輸控制協定
	特點:面向連接配接,安全可靠,效率低,基于位元組流進行通訊的,傳輸資料大小無限制
		三次握手,四次揮手
		第一次握手第一次揮手:用戶端向伺服器發起請求
		第二次握手第二次揮手:判斷是否連接配接成功
		第三次握手第三次揮手:用戶端上傳資料或伺服器回報資料
		第四次揮手:用戶端斷開連接配接
	俗稱:打電話
	如:去朋友家做客
        1.打電話,詢問是否友善
            對方接聽電話(一次握手),打完電話後會挂斷電話(一次揮手)
        2.去朋友家,敲門
            開門(一次握手),朋友倒茶(一次揮手)
        3.開始聚會
            聊天(一次握手,一次揮手)
        4.說拜拜
            一次揮手
		
	Java中對應的類:
		Socket:用戶端
		ServerSocket:伺服器
		
UDP
	中文名:資料包協定
	特點:面向無連接配接,不安全,效率高,基于資料包格式進行傳輸,一個資料包最多64kb
	俗稱:對講機
	
	如:用對講機通知同僚有小偷
		直接對着對講機說有小偷
           

基于TCP協定的通訊(掌握)

技術
	伺服器
		建立ServerSocket
		等待用戶端連接配接
		關閉資源
	用戶端
		建立用戶端Socket
		關閉資源
案例1:
	用戶端給伺服器發送一條消息
案例2:
	用戶端給伺服器發送一條消息,伺服器接收後回複一條消息,用戶端接收
案例3:
	用戶端上傳檔案給伺服器
           
package tcp01;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 伺服器
 * 要求: 接收一次用戶端消息,列印到控制台
 * 步驟: 
 * 	1.建立伺服器Socket
 * 	2.等待用戶端連接配接,擷取用戶端映射
 * 	3.通過用戶端映射擷取其輸入流
 * 	4.使用輸入流讀取資料
 * 	5.列印到控制台
 * 	6.關閉資源,關閉用戶端映射,關閉伺服器
 */

public class Server {
	public static void main(String[] args) throws IOException {
		//1.建立伺服器Socket
		/**
		* 參數:該伺服器端口号
		* 注意:該伺服器的ip就是伺服器所在計算機的ip位址
		*/
		ServerSocket server = new ServerSocket(9999);
		System.out.println("伺服器已啟動, 等待用戶端連接配接");
		//2.等待用戶端連接配接,擷取用戶端映射
		/**
		* 傳回值就是用戶端映射
		* 注意:該方法會阻塞程式,等待用戶端連接配接
		*/
		Socket socket = server.accept();
		//3.通過用戶端映射擷取其輸入流
		InputStream is = socket.getInputStream();
		//4.使用輸入流讀取資料
		byte[] b = new byte[1024];
		int len = 0;
		while((len = is.read(b)) != -1) {
			String str = new String(b, 0, len);
			//5.列印到控制台
			System.out.println("用戶端說: " + str);
		}
		//6.關閉資源,關閉用戶端映射,關閉伺服器
		is.close();
		socket.close(); //關閉用戶端映射
		server.close(); //關閉伺服器
		System.out.println("通訊結束, 伺服器關閉");
	}
}

package tcp01;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

/**
 * 用戶端
 * 要求:用戶端給伺服器發送一條消息
 * 步驟:
 * 	1.建立用戶端的Socket
 * 	2.擷取用戶端的輸出流
 * 	3.輸出資料
 * 	4.關閉資源
 */

public class Client {
	public static void main(String[] args) throws IOException {
		//1.建立用戶端的Socket
		/**
		* 參數1:伺服器的位址
		* 參數2:伺服器的端口号
		* 注意:需要先啟動伺服器,再啟動用戶端
		*/
		Socket socket = new Socket("127.0.0.1", 9999);
		//2.擷取用戶端的輸出流
		OutputStream os = socket.getOutputStream();
		//3.輸出資料
		os.write("你好!".getBytes());
		os.flush();
		//4.關閉資源
		os.close();
		socket.close();
	}
}

           

運作結果

Java學習筆記day23網絡
package tcp02;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 伺服器
 * 步驟:
 *	1.建立伺服器Socket
 *	2.等待用戶端連接配接,擷取用戶端映射
 *	3.接收用戶端消息
 *		1.擷取用戶端映射的輸入流
 *		2.通過輸入流擷取資訊
 *	4.發送消息給用戶端
 *		1.擷取用戶端映射的輸出流
 *		2.通過輸出流回複消息
 *	5.關閉資源
 */

public class Server {
	public static void main(String[] args) throws IOException {
		//1.建立伺服器Socket
		ServerSocket serverSocket = new ServerSocket(8989);
		//2.等待用戶端連接配接, 擷取用戶端映射
		Socket socket = serverSocket.accept();
		//3.接收用戶端消息
		InputStream is = socket.getInputStream();
		byte[] b = new byte[1024];
		int len = is.read(b);
		String str = new String(b, 0, len);
		System.out.println("用戶端說: " + str);
		//4.發送消息給用戶端
		OutputStream os = socket.getOutputStream();
		os.write("收到".getBytes());
		os.flush();
		//5.關閉資源
		os.close();
		is.close();
		socket.close();
		serverSocket.close();
	}
}

package tcp02;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * 用戶端
 * 步驟:
 * 	1.建立用戶端Socket
 * 	2.發送消息給伺服器
 * 		擷取輸出流
 * 		使用輸出流發送消息
 * 	3.接收伺服器回報的消息
 * 		擷取輸入流
 * 		使用輸入流接收消息
 * 	4.關閉資源
 */

public class Client {
	public static void main(String[] args) throws IOException {
		//1.建立用戶端Socket
		Socket socket = new Socket("127.0.0.1", 8989);
		//2.發送消息給伺服器
		OutputStream os = socket.getOutputStream();
		os.write("伺服器你好, 我是用戶端".getBytes());
		os.flush();
		//3.接收伺服器回報的消息
		InputStream is = socket.getInputStream();
		byte[] b = new byte[1024];
		int len = is.read(b);
		String str = new String(b, 0, len);
		System.out.println("伺服器說: " + str);
		//4.關閉資源
		is.close();
		os.close();
		socket.close();
	}
}

           

運作結果

Java學習筆記day23網絡
Java學習筆記day23網絡
package tcp03;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;

/**
 * 伺服器
 *	要求:用戶端上傳圖檔給伺服器
 *	步驟:
 *		1.建立伺服器Socket
 *		2.等待用戶端連接配接
 *		3.接收用戶端上傳的檔案,并儲存
 *		4.傳回消息給伺服器,表示說收到了
 *		5.關閉資源
 */

public class Server {
	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket = new ServerSocket(7979);
		System.out.println("伺服器已啟動");
		Socket socket = serverSocket.accept();
		InputStream is = socket.getInputStream();
		//生成檔案名稱, 使用工具類UUID
		String name = UUID.randomUUID().toString().replace("-", "");
		String file = name + ".png";
		//建立檔案流存儲上傳的檔案
		FileOutputStream fos = new FileOutputStream(file);
		byte[] b = new byte[1024];
		int len = 0;
		//用戶端輸出流斷開後,讀取的長度才可以等于-1
		while((len = is.read(b)) != -1) {
			fos.write(b, 0, len);
			fos.flush();
		}
		fos.close();
		System.out.println("用戶端上傳結束");
		OutputStream os = socket.getOutputStream();
		os.write("上傳成功".getBytes());
		os.flush();
		os.close();
		is.close();
		socket.close();
		serverSocket.close();
	}
}

package tcp03;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

/**
 * 用戶端
 * 要求:上傳一個檔案給伺服器,接收伺服器回報的消息
 * 步驟:
 * 	1.建立用戶端Socket
 * 	2.上傳檔案
 * 	3.接收伺服器消息
 * 	4.關閉資源
 */

public class Client {
	public static void main(String[] args) throws IOException {
		Socket socket = new Socket("127.0.0.1", 7979);
		OutputStream os = socket.getOutputStream();
		FileInputStream fis = new FileInputStream("D:\\query.png");
		byte[] b = new byte[1024];
		int len = 0;
		while((len = fis.read(b)) != -1) {
			os.write(b, 0, len);
			os.flush();
		}
		//結束用戶端輸出流
		socket.shutdownOutput();
		System.out.println("檔案上傳結束");
		//讀取伺服器回報的消息
		InputStream is = socket.getInputStream();
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		String str = br.readLine();
		System.out.println("伺服器說: " + str);
		br.close();
		fis.close();
		os.close();
		socket.close();
	}
}

           

運作結果

Java學習筆記day23網絡
Java學習筆記day23網絡
Java學習筆記day23網絡
Java學習筆記day23網絡
Java學習筆記day23網絡

基于UDP協定的通訊(了解)

技術:
	接收端
		DatagramSocket(端口号)
		接收端對象.receive(資料包):接收資料
	發送端
		DatagramSocket()
		發送端對象.send(資料包):用于發送資料包
	資料包
		DatagramPacket

案例:
	發送端發送一條消息給接收端
           
package udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * 接收端
 * 步驟:
 * 	1.建立接收端Socket
 * 	2.建立一個空的資料包,準備接收資料
 * 	3.接收資料
 * 	4.關閉資源
 */

public class Receive {
	public static void main(String[] args) throws IOException {
		//1.建立接收端Socket
		DatagramSocket rSocket = new DatagramSocket(10101);
		//2.建立一個空的資料包,準備接收資料
		byte[] b = new byte[1024];
		DatagramPacket packet = new DatagramPacket(b, b.length);
		//3.接收資料
		rSocket.receive(packet);
		//擷取包中的資料列印輸出
		byte[] data = packet.getData(); //擷取包中的資料
		int length = packet.getLength(); //擷取包中的資料長度
		String str = new String(data, 0, length);
		System.out.println("接收的資料: " + str);
		//4.關閉資源
		rSocket.close();
	}
}

package udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 發送端
 * 步驟:
 * 	1.建立發送端的Socket
 * 	2.準備要發送的資料包
 * 	3.發送資料
 * 	4.關閉資源
 */

public class Send {
	public static void main(String[] args) throws IOException {
		//1.建立發送端的Socket
		DatagramSocket sSocket = new DatagramSocket();
		//2.準備要發送的資料包
		byte[] b = "接收端你好, 我是發送端".getBytes();
		//接收端ip
		InetAddress address = InetAddress.getByName("127.0.0.1");
		/**
		 * 準備要發送的資料包
		 * 1參:要發送資料所在的數組
		 * 2參:開始位置
		 * 3參:發送的位元組長度
		 * 4參:接收端位址
		 * 5參:接收端端口号
		 */
		DatagramPacket packet = new DatagramPacket(b, 0, b.length, address, 10101);
		//3.發送資料
		sSocket.send(packet);
		//4.關閉資源
		sSocket.close();
	}
}

           

運作結果

Java學習筆記day23網絡

練習

使用TCP完成用戶端與伺服器的多次對話
           
package tcp04;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket = new ServerSocket(9876);
		Socket socket = serverSocket.accept();
		InputStream is = socket.getInputStream();
		OutputStream os = socket.getOutputStream();
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		String str;
		Scanner scanner = new Scanner(System.in);
		while((str = br.readLine()) != null) {
			System.out.println("用戶端說: " + str);
			System.out.println("請輸入你要回複的内容: ");
			String input = scanner.nextLine();
			os.write((input + "\n").getBytes());
			os.flush();
		}
		br.close();
		os.close();
		socket.close();
		serverSocket.close();
	}
}

package tcp04;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
	public static void main(String[] args) throws IOException {
		Socket socket = new Socket("127.0.0.1", 9876);
		OutputStream os = socket.getOutputStream();
		InputStream is = socket.getInputStream();		
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		os.write("Hello\n".getBytes());
		os.flush();
		String str;
		Scanner scanner = new Scanner(System.in);
		while((str = br.readLine()) != null) {
			System.out.println("伺服器說: " + str);
			System.out.println("請輸入你要回複的内容: ");
			String input = scanner.nextLine();
			os.write((input + "\n").getBytes());
			os.flush();
		}
		br.close();
		os.close();
		socket.close();
	}
}

           

運作結果

Java學習筆記day23網絡