java自學之路-----UDP協議 TCP協議編程


網絡模型:OSI ( Open System Interconnection)       TCP/IP{

物理層:物理設備標準 主機至網絡層

數據鏈路層:MAC地址封裝解封裝

網絡層:IP地址封裝解封裝 網際層

傳輸層:協議,端口號 傳輸層

會話層:建立數據傳輸通道

表示層:對數據解析 應用層

應用層:終端應用

}


DNS解析:配置文件,存儲的是網址與IP地址。輸入網址後查詢該文件,找到IP地址,然後進行連接。

本地有該文件,則先獲取本地,在獲取互聯網上。

UDP協議{

特點:

1.將數據及源和目的封裝到數據包,不需要建立連接,每個數據包限制在64k

2.因爲不需要實時連接,所以是不可靠的協議,速度快


用到的類:DatagramSocket:用來傳輸接收數據包 DatagramPacket:用來將數據封裝成數據包


練習:

發送端,接收端的運行順序不需要限定

	/**
	 * 建立一個發送數據的端口
	 * 
	 *思路:
	 *	1.有一個發送數據包的發送端
	 *	2.有將數據進行打包的對象,並且制定發送的目的
	 *	3.通過發送端將數據包發送出去
	 *
	 *步驟:
	 *	1.建立發送端對象
	 *	2.創建發送的緩衝區,從鍵盤上讀取數據
	 *	3.建立一個循環,讀取鍵盤內容,併發送
	 *	3.建立數據包對象,指定接收端的地址,端口號,以及發送的數據
	 *	4.定義一個循環結束的標記,讀到該標記就結束循環
	 *	5.關閉資源 
	 * @param args
	 * @throws IOException 
	 */

	public static void main(String[] args) throws IOException {
		
		DatagramSocket sender = new DatagramSocket();		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = null;
		
		while((line=br.readLine()) != null){
			while(line.equals("over"))
				break;
			DatagramPacket data = new DatagramPacket(line.getBytes(), 0, line.length(),InetAddress.getLocalHost(), 8090);
			sender.send(data);			
		}
		sender.close();
	}

	/**
	 * 建立一個接受數據的端口
	 * 
	 *思路:
	 *	1.有一個接受數據包的接收端
	 *	2.有接收數據包的對象,並將數據進行解析
	 *	3.將接收到的數據打印
	 *
	 *步驟:
	 *	1.建立接收端對象,指定端口號
	 *	2.創建接收對象的對象,用於解析數據
	 *	3.建立一個循環,
	 *	3.接收發送端的內容,
	 *	5.關閉資源 
	 * @param args
	 * @throws IOException 
	 * @throws IOException 
	 */

	public static void main(String[] args) throws IOException {
		DatagramSocket receiver = new DatagramSocket(8090);
		byte[] buf = new byte[1024];
		DatagramPacket dataRe = new DatagramPacket(buf, buf.length);
		
		while(true){
			receiver.receive(dataRe);
			System.out.println(new String(dataRe.getData(),0,dataRe.getLength()));			
		}
	}

}


TCP協議{

特點;

1.建立連接,形成傳輸數據的通道,能進行大數據量傳輸

2.實時連接(三次握手完成),可靠的協議,效率較低


用到的類:Socket:客戶端 ServerSocket:服務端


練習:

必須先運行服務端,再運行客戶端

	/**
	 * 建立一個服務端,與客戶端聯繫
	 * 
	 *	思路:
	 *	1.需要一個服務端對象,指定端口號,用於被客戶端連接
	 *	2.利用方法連接客戶端
	 *	3.獲取客戶端的流對象,以及發送的數據
	 *	4.再次獲取客戶端的流對象,發送數據
	 *	步驟:
	 *	1.創建一個服務端對象,指定端口號,
	 *	2.連接客戶端
	 *	3.獲取客戶端輸入流對象,讀取數據
	 *	4.將數據打印,
	 *	5.獲取客戶端輸出流對象,寫出數據
	 *	6.關閉資源
	 * 
	 * @param args
	 * @throws IOException 
	 */

	public static void main(String[] args) throws IOException {
		
		ServerSocket server = new ServerSocket(9090);
		Socket so =	server.accept();
		InputStream is = so.getInputStream();
		byte[] buf = new byte[1024];
		int len = is.read(buf);
		System.out.println(new String(buf, 0, len));
		
		OutputStream os = so.getOutputStream();
		os.write("收到".getBytes());
		
		server.close();	
		so.close();
	}

	/**
	 * 有一個客戶端,用來與服務端進行通信
	 *
	 *	思路:
	 *	1.創建一客戶端,指定服務端地址,端口,與其進行通信
	 *	2.利用輸出流往外寫數據
	 *	3.利用輸入流讀取服務端發送過來的數據
	 *
	 *	步驟:
	 *	1.創建一個客戶端,指定地址,端口號
	 *	2.獲取輸出流
	 *	3.寫出數據
	 *	4.獲取輸入流
	 *	5.讀取數據
	 * 
	 * @param args
	 * @throws IOException 
	 * @throws UnknownHostException 
	 */

	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket client = new Socket(InetAddress.getLocalHost(), 9090);
		OutputStream os = client.getOutputStream();
		os.write("客戶端連接成功".getBytes());
		os.flush();
		
		InputStream is = client.getInputStream();
		byte[] buf = new byte[1024];
		int len = is.read(buf);
		System.out.println(new String(buf, 0, len));
		client.close();
	}

客戶端發送小寫,接收大寫

/**
	 * 要求: 有一個服務端,接收客戶端傳過來的字符串並將其轉爲大寫返回給客戶端
	 * 
	 * 思路:
	 * 1.有一個服務端對象,接收客戶端數據之後將其轉爲大寫
	 * 2.利用客戶端的流把大寫字符傳到客戶端
	 * 3.需要將從客戶端獲取的字節流轉爲操作字符串的流
	 * 
	 * 步驟:
	 * 	1.創建一個服務端對象,指定端口號
	 * 	2.與客戶端進行通信,並獲得客戶端對象
	 * 	3.使用客戶端的輸入流,封裝成字符流。讀取數據
	 * 	4.可以使用字符串的靜態轉換方法。將數據轉爲大寫,再利用客戶端輸出流,傳到客戶端
	 * 	5.指定一個循環,並指定結束標記,在循環內部執行第3.4兩步驟
	 * 	6.關閉資源
	 * 
	 * @param args
	 * @throws IOException 
	 */

	public static void main(String[] args) throws IOException {
		ServerSocket transSer = new ServerSocket(9010);
		Socket client = transSer.accept();
		BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
		String line = null;
		
		while((line=br.readLine()) != null){
			if(line.equals("over"))
				break;
			String upperLine = line.toUpperCase();
			BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
			bos.write(upperLine);
			bos.newLine();
			bos.flush();
		}
		transSer.close();

	}

/**
	 * 要求:有一個客戶端,與某個服務端連接之後,往服務端傳輸數據,並接受服務端的數據
	 * 
	 * 思路:
	 * 1.有一個客戶端,指定通信服務端的ip地址以及端口號
	 * 2.利用自身的輸出流對象,往服務端傳送數據
	 * 3.利用自身的輸入流對象,接受服務端傳過來的數據
	 * 4.可以將字節流對象封裝成操作字符串的對象
	 * 
	 * 步驟:
	 * 1.創建一個客戶端,與服務端通信
	 * 2.從鍵盤上讀取數據,
	 * 3.將輸出流對象封裝成緩衝字符流,並將讀取到的數據寫到服務端
	 * 4.利用輸入流對象,讀取從服務端傳送過來的數據。
	 * 5.穿件循環,指定結束標記,執行步驟2.3.4
	 * 
	 * @param args
	 * @throws IOException 
	 * @throws UnknownHostException 
	 */

	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket client = new Socket(InetAddress.getLocalHost(), 9010);
		String line = null;
		while(true){
			BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
			line = is.readLine();
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
			bw.write(line);
			bw.newLine();
			bw.flush();
			if(line.equals("over"))
				break;
			BufferedReader readServer = new BufferedReader(new InputStreamReader(client.getInputStream()));
			line = readServer.readLine();
			System.out.println(line);			
		}
	}


}



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