黑馬程序員_網絡編程

---------------------- android培訓 、 java培訓 、 期待與您交流! ----------------------


1、 網絡編程的三要素:IP地址:InetAddress、端口號、傳輸協議
        要實現網絡通訊:
        1. 找到對方 IP
        2. 數據要發送到對方指定的應用程序上。爲了標識這些應用程序,所以給這些網絡應用程序都用數字進行標識,爲了方便稱呼這個數字,叫做端口。指的是邏輯端口
        3. 定義通訊規則,這個規則稱爲協議。

        國際組織了通用協議TCP/IP。

2、 IP地址:InetAddress
        四段組成,每一段都是一個字節,一個字節取值範圍0~255
        新段地址IP/V6,6段組成
        本地迴環地址:127.0.0.1  主機名:localhost

3、 端口號
        用於標識進程的邏輯地址,不同進程的標識
        有效端口:0~65535,其中0~1024系統使用或保留端口
        常見端口:Web服務:80、 Tomcat:8080、 mySQL:3306


4、 網絡模型兩種:
        1. OSI OpenSystem Interconnection 開放系統互聯參考模型
        2. TCP/IP參考模型
        3、 常見協議:UDP、TCP

        a. UDP特點:面向無連接
            將數據及源和目的封裝成數據包中,不需要建立連接
            每個數據報的大小在限制在64k內
            因無連接,是不可靠協議
            不需要建立連接,速度快
        b. TCP特點:面向諒解可靠的,建立連接傳輸大量數據
            建立連接,形成傳輸數據的通道。
            在連接中進行大數據量傳輸
            通過三次握手完成連接,是可靠協議
            必須建立連接,效率會稍低

5、 InetAddress:表示互聯網協議的IP地址

	//演示獲取IP實例
	public class IPDemo {
		public static void main(String[] args) throws IOException {
			//獲取本機地址
			InetAddress ip=InetAddress.getLocalHost();
			//打印地址
			System.out.println(ip);//ThinkPad/169.254.124.183
			//獲取地址
			System.out.println("address:"+ip.getHostAddress());//address:169.254.124.183
			//獲取主機名
			System.out.println("name:"+ip.getHostName());//name:ThinkPad
			
			//獲取任意一臺主機地址
			InetAddress ia=InetAddress.getByName("169.254.124.183");
			
			System.out.println("ia:"+ia.getHostAddress());//ia:169.254.124.183
			System.out.println("ia:"+ia.getHostName());//ia:ThinkPad
		}
	}
6、 Socket:網絡編程指的就是Socket編程
        Socket就是爲網絡服務提供的一種機制。
        通信的兩端都有Socket。
        網絡通信其實就是Socket間的通信。
        
數據在兩個Socket間通過IO傳輸。

7、 UDP傳輸
        DatagramSocket與DatagramPacket
        建立發送端,接收端。
        建立數據包。
        調用Socket的發送接收方法。
        關閉Socket。

        發送端與接收端是兩個獨立的運行程序。

        a. 在發送端,要在數據包對象中明確目的地IP及端口。

        DatagramSocket ds = new DatagramSocket();
        byte[] by = “hello,udp”.getBytes();
        DatagramPacket dp = new DatagramPacket(by,0,by.length,
                    InetAddress.getByName(“127.0.0.1”),10000);
        ds.send(dp);
        ds.close();
	演示實例:
	public class UDPDemo {

		public static void main(String[] args) throws IOException {

			// 創建udp服務,通過DatagramSocket()對象。
			DatagramSocket ds = new DatagramSocket();

			// 確定數據,並封裝成數據包。
			byte[] buf = "udp ge men lai le !".getBytes();
			DatagramPacket dp = new DatagramPacket(buf, buf.length,
					InetAddress.getByName("127.0.0.1"), 10000);
			// 通過socket服務,將已有的數據包發送出去,通過send方法。
			ds.send(dp);

			// 關閉資源
			ds.close();
		}
	}
        b. 在接收端,要指定監聽的端口。

        DatagramSocket ds = new DatagramSocket(10000);
        byte[] by = new byte[1024];
        DatagramPacket dp = new DatagramPacket(by,by.length);
        ds.receive(dp);
        String str = new String(dp.getData(),0,dp.getLength());
        System.out.println(str+"--"+dp.getAddress());
        ds.close();
	演示實例:
	public class UDPServerDemo {

		public static void main(String[] args) throws IOException {
			// 創建udp Socket,建立連接
			DatagramSocket ds = new DatagramSocket(10000);

			// 定義數據包,用於存儲數據
			byte[] buf = new byte[1024];
			DatagramPacket dp = new DatagramPacket(buf, buf.length);

			// 通過服務的receive方法將接收到的數據存入到數據包中
			ds.receive(dp);

			// 通過數據包的方法獲取其中的數據
			String ip = dp.getAddress().getHostAddress();
			String data = new String(dp.getData(), 0, dp.getLength());
			int port = dp.getPort();

			System.out.println(ip + "::" + data + "::" + port);
			
			//關閉資源
			ds.close();
		}
	}
8、 TCP傳輸:
        Socket和ServerSocket
        建立客戶端和服務器端
        建立連接後,通過Socket中的IO流進行數據的傳輸
        關閉socket
        同樣,客戶端與服務器端是兩個獨立的應用程序。

        客戶端基本思路:
        a. 客戶端需要明確服務器的ip地址以及端口,這樣纔可以去試着建立連接,如果連接失敗,會出現異常。
        b. 連接成功,說明客戶端與服務端建立了通道,那麼通過IO流就可以進行數據的傳輸,而Socket對象已經提供了輸入流和輸出流對象,通過getInputStream(),getOutputStream()獲取即可。
        c. 與服務端通訊結束後,關閉Socket。

        通過Socket建立對象並指定要連接的服務端主機以及端口。
        Socket s = new Socket(“192.168.1.1”,9999);
        OutputStream out = s.getOutputStream();
        out.write(“hello”.getBytes());
        s.close();
	客戶端演示:
	public class ClientDemo {

		public static void main(String[] args) throws IOException, IOException {
			
			//創建客戶端的Socket服務,指定目的的主機和端口
			Socket s=new Socket("127.0.0.1",100001);
			
			//爲了發送數據,應該獲取socket流中的輸出流
			OutputStream out =s.getOutputStream();
			out.write("TCP哥們來了".getBytes());
			
			//關閉資源
			s.close();
		}
	}
        服務端基本思路:
        a. 服務端需要明確它要處理的數據是從哪個端口進入的。
        b. 當有客戶端訪問時,要明確是哪個客戶端,可通過accept()獲取已連接的客戶端對象,並通過該對象與客戶端通過IO流進行數據傳輸。
        c. 當該客戶端訪問結束,關閉該客戶端。

        建立服務端需要監聽一個端口
        ServerSocket ss = new ServerSocket(9999);
        Socket s = ss.accept ();
        InputStream in = s.getInputStream();
        byte[] buf = new byte[1024];
        int num = in.read(buf);
        String str = new String(buf,0,num);
        System.out.println(s.getInetAddress().toString()+”:”+str);
        s.close();
        ss.close();
        服務端演示:

        Tcp傳輸最容易出現的問題:
        客戶端連接上服務端,兩端都在等待,沒有任何數據傳輸。
        通過例程分析:
            因爲read方法或者readLine方法是阻塞式。
        解決辦法:
            自定義結束標記
            使用shutdownInput,shutdownOutput方法。

9、常見的客戶端和服務端

        客戶端:瀏覽器、QQ ...

        服務端:Tomcat ...

        http 超文本傳輸協議

10、URL對象,把地址封裝成對象,便於對地址操作
        urlConnection  安卓開發方面用的比較多
	public class URLDemo {

		public static void main(String[] args) throws MalformedURLException {
			URL url = new URL(
					"http://127.0.0.1:8080/myweb/demo.html?name=li&age=23");
			
			System.out.println(url.getProtocol());// http
			System.out.println(url.getHost());// 127.0.0.1
			System.out.println(url.getPort());// 8080
			System.out.println(url.getPath());// /myweb/demo.html
			System.out.println(url.getFile());// /myweb/demo.html?name=li&age=23
			System.out.println(url.getQuery());// name=li&age=23

			URLConnection conn=url.openConnection();
			System.out.println(conn);//sun.net.www.protocol.http.HttpURLConnection:http://127.0.0.1:8080/myweb/demo.html?name=li&age=23
			
			InputStream in=conn.getInputStream();
			byte[]buf=new byte[1024];
			int len=in.read(buf);
			System.out.println(new String(buf,0,len));
		}
	}
11、 http://192.168.1.254:8080/myweb/demo.html
        www.baidu.com想要將主機名翻譯成ip地址,需要域名解析。DNS
        域名解析服務器:裏面記錄的是主機名與ip地址的映射關係。

        http://127.0.0.1:8080
        http://localhost:8080
        其實127和localhost的映射關係就在本機上。
        C:\Windows\System32\drivers\etc\host

12、CS client server
        特點:
        1. 客戶端和服務端都需要開發
        2. 後期維護較爲麻煩
        3. 將服務端的部分運算轉到了客戶端。

13、BS Browser Server
        特點:
        1. 程序員只需要編寫服務端
        2. 對客戶端的維護很容易。客戶端什麼都不需要裝,只需要有瀏覽器即可。
        3.所有的運算都在服務端,壓力較大。


---------------------- android培訓 、 java培訓 、 期待與您交流! ----------------------
詳細請查看:www.itheima.com

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