1. 程式人生 > >黑馬程式設計師——Java 網路程式設計

黑馬程式設計師——Java 網路程式設計

-----------android培訓java培訓、java學習型技術部落格、期待與您交流!------------

一、概述

1.網路模型

網路模型常見的有ISO參考模型和TCP/IP參考模型,兩者的對應關係如下圖:


  ISO參考模型分為七個層次:應用層、表示層、會話層、傳輸層、網路層、資料鏈路層、物理層。

  TCP/IP參考模型分為四個層次:應用層、傳輸層、網際層、主機至網路層。

  1)對於TCP/IP參考模型,開發人員一般處於傳輸層和網際層,web開發屬於應用層,使用者操作也屬於應用層。各層所對應的常見協議如下:

   應用層:HTTP協議、FTP協議等。

   傳輸層:UDP協議、TCP協議等。

   網際層:IP協議等。

  2)資料封包與資料拆包:

   資料封包:資料在傳輸前,按照某一參考模型逐層進行封裝該層的特有標識的過程。

   資料拆包:資料傳輸完後,按照某一參考模型逐層進行拆解該層的特有標識的過程。

   示例:ISO參考模型的封包與拆包圖解。


 2.網路通訊要素

1)IP地址:

   網路裝置的標識,是IP協議提供的一種統一的地址格式,它為網際網路上的每一個網路和每一臺主機分配一個邏輯地址,以此來遮蔽實體地址的差異。

   a)IP 地址是 IP 使用的 32 位或 128 位無符號數字,它是一種低階協議,UDP 和 TCP 協議都是在它的基礎上構建的。

   b)IP地址是一個32位的二進位制數,通常被分割為4個“8位二進位制數”(也就是4個位元組)。IP地址通常用“點分十進位制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之間的十進位制整數。

   c)每個IP地址至少對應一個或多個主機名,主機名比IP地址更容易記憶。

   d)IP地址127.0.0.1為本地迴環地址,可以用於測試網絡卡,對應的主機名為localhost,主機名可以在host檔案進行修改。

   IP地址在java中用InetAddress類進行描述,InetAddress有兩個子類,分別為Inet4Address和Inet6Address。

   獲取InetAddress物件的方法:

    a)通過給定原始IP地址獲取:

     static InetAddress getByAddress(byte[] addr):該方法將IP地址的四段分別存入位元組陣列,由於位元組陣列的範圍在-128到127,如果超出127的段,則返回的為負數,使用原始IP地址時應注意修正。

    b)通過主機名和IP地址獲取:

     static InetAddress getByAddress(String host, byte[] addr):

    c)通過主機名獲取:

     static InetAddress getByName(String host):

    d)直接呼叫返回本地主機: 

     static InetAddress getLocalHost():

    e)通過主機名,返回其 IP 地址所組成的陣列:

     static InetAddress[]getAllByName(String host):

    注:所有獲取InetAddress物件的方法,都將丟擲UnknownHostException異常,該異常為IOException異常的子類。

   InetAddress類的常用方法:

    a)獲取IP地址的字串表示:

     String getHostAddress():

    b)獲取主機名:

     String getHostName():

    c)獲取InetAddress物件的原始IP地址:

     byte[] getAddress():

  2)埠號:

   a)用於表示程序的邏輯地址。

   b)埠號的範圍為0到65535,其中0到1024為系統使用或保留埠,但也可以使用,只要與系統不衝突即可。

  3)傳輸協議:

   傳輸協議即通訊規則,常見的協議有UDP和TCP。

二、UDP通訊

 1.特點:

UDP是面向無連線的,即UDP沒有建立連線的過程,沒有傳送連線請求資料包,而是直接傳送要傳輸的資料包,因此具有連線速度快,但一次傳輸資料量較少且傳輸可靠性較低的特點,傳輸過程容易丟失資料。因此UDP特點總結如下:
  1)將資料及源和目的封裝成資料包中,不需要建立連線,速度快。
  2)每個資料報包的大小在限制在64k內,一次傳輸少量資料。
  3)因無連線,是不可靠的協議,有可能丟失資料。

 2.應用場合:

  UDP適用於對傳輸速度要求較高,一次傳輸資料量不大,且可靠性要求不高的應用環境,如視訊會議、視訊
直播、桌面共享等。

 3.DatagramSocket類:

  此類表示用來發送和接收資料報包的套接字。資料報套接字是包投遞服務的傳送或接收點。每個在資料報套接字上傳送或接收的包都是單獨編址和路由的。從一臺機器傳送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。

  1)建立DatagramSocket物件:只能通過建構函式建立。

   DatagramSocket():構造資料報套接字並將其繫結到本地主機上任何可用的埠。

   DatagramSocket(int port):建立資料報套接字並將其繫結到本地主機上的指定埠。

   DatagramSocket(int port, InetAddress laddr):建立資料報套接字,將其繫結到指定的本地地址。

   DatagramSocket(SocketAddress bindaddr): 建立資料報套接字,將其繫結到指定的本地套接字地址。

  2)常用方法:

    void send(DatagramPacket p):從此套接字傳送資料報包。

    void receive(DatagramPacket p);從此套接字接收資料報包。

    InetAddress getInetAddress():返回此套接字連線的地址。

    int getPort():返回此套接字的埠。

    void connect(InetAddress address, int port):將套接字連線到此套接字的遠端地址。

    void connect(SocketAddress addr):將此套接字連線到遠端套接字地址(IP 地址 + 埠號)。

    void close():關閉此資料報套接字。

  注:更多方法參見API文件。 

 4.DatagramPacket類:

  此類表示資料報包。資料報包用來實現無連線包投遞服務。每條報文僅根據該包中包含的資訊從一臺機器路由到另一臺機器。從一臺機器傳送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。

  1)建立DatagramPacket物件:

   DatagramPacket(byte[] buf, int length):

   DatagramPacket(byte[] buf, int length, InetAddress address, int port):

   DatagramPacket(byte[] buf, int length, SocketAddress address):

  2)常用的方法:

   InetAddress getAddress():返回某臺機器的 IP 地址,此資料報將要發往該機器或者是從該機器接收到的。

   byte[] getData():返回資料緩衝區。

   int getLength(): 返回將要傳送或接收到的資料的長度。

   int getPort():返回某臺遠端主機的埠號,此資料報將要發往該主機或者是從該主機接收到的。

   SocketAddress getSocketAddress():獲取要將此包傳送到的或發出此資料報的遠端主機的 SocketAddress(通常為 IP 地址 + 埠號)。

  注:更多方法參見API文件。

 5.UDP傳輸:

  1)UDP傳送端的建立步驟:

   a)建立DatagramSocket服務,可指定傳送端的埠。
   b)將要傳送的資料封包,封包的類為DatagramPacket,且需要指定目標IP物件和目標埠以及封裝的資料和長度。
   c)利用DatagramSocket服務的send方法將資料包傳送出去。
   d)關閉資源。

  2)UDP接收端的建立步驟:

   a)建立DatagramSocket服務,並指定埠,以接收發送端發來的資料。
   b)定義一個數據包,用來儲存接收來的資料。
   c)通過DatagramSocket服務的receive方法將資料儲存到所定義的資料包中。
   d)利用資料包物件的更多功能實現對接收資料的不同操作。
   e)關閉資源。

  3)程式碼示例:

//定義UDP傳送端
import java.net.*;
class UdpSend
{
	public static void main(String[] args) throws Exception
	{
		//建立傳送端Socket服務,並指定傳送端程式的埠為8888
		//如果不指定埠,則系統會自行分配
		DatagramSocket ds=new DatagramSocket(8888);

		//定義要一個位元組陣列,用來儲存要傳送的資料
		byte[] buf="hello UdpRece".getBytes();

		//將要傳送的資料封包,並指定目標主機IP物件和目標埠
		DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);

		//通過Socket服務中的send方法將資料包傳送出去
		ds.send(dp);

		//關閉資源
		ds.close();

	}
}

//定義UDP接收端
class UdpRece
{
	public static void main(String[] args) throws Exception
	{
		//建立傳送端Socket服務,並指定接收端程式的埠為10000
		DatagramSocket ds=new DatagramSocket(10000);

		//定義要一個位元組陣列
		byte[] buf=new byte[1024];

		//定義一個數據包,用來儲存要接受的資料
		DatagramPacket dp=new DatagramPacket(buf,buf.length);

		//通過接收端Socket服務中的receive方法將資料儲存到所定義的資料包中
		ds.receive(dp);

		//獲取傳送端主機IP物件,並通過該物件獲取傳送端主機地址
		String ip=dp.getAddress().getHostAddress();

		//獲取接收的資料內容
		byte[] data=dp.getData();

		//獲取傳送端主機程式埠
		int port=dp.getPort();

		//列印獲取的資料到控制檯
		//獲取列印資料的實際長度為getLength方法
		System.out.println(ip+"--"+(new String(data,0,dp.getLength()))+"--"+port);

		//關閉資源
		ds.close();

	}
}
 6.程式碼練習:

  練習1:UDP傳送端通過鍵盤錄入的方式向UDP接收端傳送資料。

<pre name="code" class="java">import java.net.*;
import java.io.*;
class UdpSend
{
	public static void main(String[] args) 
	{
		DatagramSocket ds=null;
		BufferedReader bufr=null;
		try
		{
			ds=new DatagramSocket();
			bufr=new BufferedReader(new InputStreamReader(System.in));
			String line=null;
			while((line=bufr.readLine())!=null)
			{
				if (line.equals("over"))
				{
					break;
				}
				byte[] buf=line.getBytes();
				DatagramPacket dp=
					new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.90.31"),10002);
				ds.send(dp);
				
			}
		}

		//SocketException異常為IOException異常的子類
		catch(SocketException ex)
		{
			System.out.println("Socket異常:"+ex.toString());
		}
		catch (IOException e)
		{
			System.out.println("IO異常:"+e.toString());
		}
		finally
		{
			if (bufr!=null)
			{
				try
				{
					bufr.close();
				}
				catch (IOException e)
				{
					System.out.println(e.toString());
				}
			}
			ds.close();
		}
	}
}

class UdpRece
{
	public static void main(String[] args) 
	{
		DatagramSocket ds=null;
		try
		{
			ds=new DatagramSocket(10002);
			while (true)
			{
				byte[] buf=new byte[1024];
				DatagramPacket dp=new DatagramPacket(buf,buf.length);
				ds.receive(dp);//丟擲了IOException異常
				String ip=dp.getAddress().getHostAddress();
				String data=new String(dp.getData(),0,dp.getLength());
				System.out.println(ip+"--"+data);
			}
			
		}
		catch (SocketException e)
		{
			throw new RuntimeException("Socket服務建立失敗");
		}
		catch (IOException ex)
		{
			throw new RuntimeException("接受資料異常");
		}
		finally
		{
			ds.close();
		}
	}
}
  練習2:UDP傳送端與接收端互相通訊。
<pre name="code" class="java">//定義UDP傳送端
import java.net.*;
class UdpSend3
{
	public static void main(String[] args) throws Exception
	{
		//向UDP接收端傳送資料包
		DatagramSocket ds=new DatagramSocket(8888);
		byte[] buf="hello UdpRece".getBytes();
		DatagramPacket dp=
			new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.90.36"),10000);
		ds.send(dp);

		//接收UDP傳送端傳送的資料包
		buf=new byte[1024];
		DatagramPacket dps=new DatagramPacket(buf,buf.length);
		ds.receive(dps);
		String ip=dps.getAddress().getHostAddress();
		byte[] data=dps.getData();
		int port=dps.getPort();
		System.out.println(ip+"--"+(new String(data,0,dps.getLength()))+"--"+port);

		//關閉資源
		ds.close();

	}
}

//定義UDP接收端
class UdpRece3
{
	public static void main(String[] args) throws Exception
	{
		//接收UDP傳送端傳送的資料包
		DatagramSocket ds=new DatagramSocket(10000);
		byte[] buf=new byte[1024];
		DatagramPacket dp=new DatagramPacket(buf,buf.length);
		ds.receive(dp);
		String ip=dp.getAddress().getHostAddress();
		byte[] data=dp.getData();
		int port=dp.getPort();
		System.out.println(ip+"--"+(new String(data,0,dp.getLength()))+"--"+port);
		
		//向UDP傳送端返回資料包
		buf="hello UdpSend".getBytes();
		DatagramPacket dpr=new DatagramPacket(buf,buf.length,dp.getAddress(),dp.getPort());
		ds.send(dpr);


		//關閉資源
		ds.close();
	}
}
三、TCP通訊

 1.特點:

  TCP是面向有連線的,即TCP在傳送資料之前,會先發送連線請求資料包,通過三次握手建立起連線,然後再進行資料的傳送,因此具有傳輸可靠性強,一次傳輸資料量大的特點,但由於需要建立連線,傳輸速度稍慢。因此TCP的特點總結如下:  

   1)建立連線,形成傳輸資料的通道。  

   2)在連線中進行大資料傳輸。  

   3)通過三次握手完成連線,是可靠協議。    

   4)因為必須建立連線,所以效率會稍低,速度稍慢。

 2.應用場合:

  TCP通訊適用於對傳輸速度要求不高,但一次傳輸資料量較大,且可要性要求很高的應用場合,如資料下載、檔案傳輸等。

 3.Socket類:

  此類實現客戶端套接字(也可以就叫“套接字”)。套接字是兩臺機器間通訊的端點。

  1)建立Socket物件的常見構造方法:

   Socket(InetAddress address, int port):建立一個流套接字並將其連線到指定 IP 地址的指定埠號。

   Socket(String host, int port):建立一個流套接字並將其連線到指定主機上的指定埠號。

  2)常用方法:

   InputStream getInputStream():返回此套接字的輸入流。

   OutputStream getOutputStream():返回此套接字的輸出流。

   void shutdownInput(): 此套接字的輸入流置於“流的末尾”。

   void shutdownOutput():禁用此套接字的輸出流。

   InetAddress getInetAddress():返回套接字連線的地址。 

   int getPort():返回此套接字連線到的遠端埠。

   void close():關閉此套接字。

  注:更多方法參見API文件。

 4.ServerSocket類:

此類實現伺服器套接字。伺服器套接字等待請求通過網路傳入。它基於該請求執行某些操作,然後可能向請求者返回結果。

  1)建立ServerSocket物件的常見構造方法:

   ServerSocket(int port): 建立繫結到特定埠的伺服器套接字。

   ServerSocket(int port, int backlog):利用指定的 backlog 建立伺服器套接字並將其繫結到指定的本地埠號。

  2)常見的方法:

   Socket accept():偵聽並接受到此套接字的連線。

   InetAddress getInetAddress():返回此伺服器套接字的本地地址。

   void close(): 關閉此套接字。

  注:更多方法參見API文件。

 5.TCP傳輸:

  1)TCP客戶端的建立步驟:

   a)建立Socket服務,並指定連線的主機和埠。   

   b)獲取鍵盤錄入或讀取硬碟檔案資料。   

   c)獲取Socket輸出流,將資料傳送給服務端。   

   d)獲取Socket讀取流,讀取服務度返回的資料。   

   e)關閉資源。

相關推薦

黑馬程式設計師——Java 網路程式設計

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 一、概述 1.網路模型 網路模型常見的有ISO參考模型和TCP/IP參考模型,兩者的對應關係如下圖:   ISO參考模型分為七個層次:應用層、表示層、

黑馬程式設計師之 --- 網路程式設計

 ------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">

黑馬程式設計師_網路程式設計TCP之學習筆記

------- android培訓、java培訓、期待與您交流! ---------- TCP網路傳輸。 客戶端和服務端,分別對應著兩個物件。 Scoket(客戶端)和ServerSocket(服務端)。   Socket(String  address, int po

黑馬程式設計師-JAVA高階(網路程式設計)PART2

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 這部分的知識點主要有: 1.TCP傳輸的幾個應用; 2.瀏覽器訪問伺服器。 一、TCP傳輸的幾個應用

黑馬程式設計師-JAVA高階(網路程式設計)PART1

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 這部分的主要知識點: 1.網路程式設計概述; 2.UDP傳輸; 3.TCP傳輸。 一、網路程式設計概述

黑馬程式設計師----JAVA基礎之GUI視覺化程式設計與列舉&網路程式設計

                                                            ------ android培訓、java培訓、期待與您交流! ---------- 一、GUI視覺化程式設計 1. GUI視覺化程式設計是什麼? 就是讓介

黑馬程式設計師--Java學習日記之GUI&網路程式設計

------- android培訓、java培訓、期待與您交流! ---------- GUI 如何建立一個視窗並顯示  Graphical User Interface(圖形使用者介面)。   

黑馬程式設計師Java程式設計異常知識總結

------- android培訓、java培訓、期待與您交流! ---------- -Java面向物件程式設計知識點總結。 一:內部類。 將一個類定義在另一個類的裡面,就稱該類為內部類。 1.內部類的特點:1.內部類可以直接訪問外部類的成員,包括私有成員。

黑馬程式設計師 java程式設計之面向物件學習筆記

---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ----------------------面向物件:以前學習過C語言,C語言是面向過程,裡面功能的實現都是由呼叫一個個的函式來完成的,而java是面向物件的程式語

黑馬程式設計師 java程式設計之面向物件學習筆記總結

---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ---------------------- 繼承: 在java中,在我們要對一個事物進行封裝時,發現有某一個類的特性和要封裝的這個 類的特性相同,而我們可以在這個

黑馬程式設計師 java基礎24天 GUI程式設計學習總結

---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! --------------------- 一.圖形使用者介面 GUI:Graphical  User Interface(圖形使用者介面) CLI:Comman

黑馬程式設計師 java程式設計基礎知識筆記

---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ----------------------Java程式設計基礎 java程式的註釋: 根據不同的功能,分三種: 1、單行註釋比如:int num = 10;//定

黑馬程式設計師----Java基礎之反射

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之GUI

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之IO包中其它類

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎基礎之IO流

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之集合類(一)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之String類

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之多執行緒

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之面向物件(最終篇)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g