網絡編程總結(按照視頻順序):java
1.網絡模型概述編程
1.1OSI(七層)瀏覽器
應用層 安全 |
表示層服務器 |
會話層網絡 |
傳輸層多線程 |
網絡層socket |
數據鏈路層tcp |
物理層網站 |
應用層:用戶能夠看到的,終端應用如WEB,QQ等
表示層:對接收到的數據進行加密和解析
會話層:經過傳輸層創建數據傳輸通道
傳輸層:定義傳輸數據的協議和端口號
網絡層:將從下層收到的數據進行IP地址的封裝和解封裝
數據鏈路層:將從下層收到的數據進行MAC地址的封裝與解封裝
物理層:定義物理設備標準
1.2TCP/IP
應用層 |
傳輸層 |
網絡層 主機至網絡層 |
2網絡要素:
2.1IP地址:物理設備的網絡地址,標識
2.2端口:進程的標識,屬於IP地址下屬的端口位置
2.3傳輸協議
DNS(域名解析器)
當在網頁上輸入網址名時,會先訪問本地有沒有對應的DNS文件(c://system32/driver/etc/hosts),格式爲IP地址-IP名,而後訪問網絡服務器上的DNS文件,返回相對應的IP地址,而後根據IP地址訪問網站。
3網絡編程
3.1 InetAddress
1 public class InetAdressTest { 2 public static void main(String[] args) throws UnknownHostException { 3 //得到本地主機IP對象 4 InetAddress ip = InetAddress.getLocalHost() ; 5 System.out.println(ip.getHostName()); 6 System.out.println(ip.getHostAddress()); 7 //得到其餘主機的ip對象 8 ip =InetAddress.getByName("192.168.1.104"); 9 System.out.println(ip.getHostAddress()); 10 System.out.println(ip.getHostName()); 11 } 12 }
在其中我發現getHostAdress()方法和getHostName()方法不可使用InetAdress變量直接調用,須要先獲取要查詢主機的IP地址。以前我一直覺得類中的方法均可以直接調用該類的對象直接調用。
3.2域名解析(DNS)
在服務器有這麼一個DNS文件,裏面記錄了ip名和IP地址的對應關係,通常在服務時,經過ip名找到對應的ip地址,而後經過ip地址進行查找。
3.3Socket
Socket能夠比喻爲港口,船在港口間傳輸;。
兩端都有socket;
網絡通訊其實就是socket間的通訊;
數據在兩個Socket間是io傳輸;
服務器端先開啓服務,用戶端再進行鏈接。
安全係數較高。
3.4UDP協議
就好像發快遞同樣,發送方只需在快遞單上寫明收信地址和收信人姓名便可,發出去以後就再也不管對方是否收到;接收方收到以後也不向發送方進行確認。
安全係數低。
發送方:
public class AutoSend { /** * @param args * UDP協議實現思路 * 1創建udp的socket服務 * 2封裝數據到數據包中 * 3發送經過socket的服務 * 4關閉socket的服務 * @throws IOException */ public static void main(String[] args) throws IOException { System.out.println("發送端啓動..."); //1 DatagramSocket ds = new DatagramSocket(); //2 BufferedReader bis = new BufferedReader(new InputStreamReader(System.in)); String line = null; while((line=bis.readLine())!=null){ if("over".equals(line)) break; byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.100.1.255"),8000); ds.send(dp); } ds.close(); } }
接收方:
1 public class AutoRecive { 2 3 /** 4 * @param args 5 * 思路: 6 * 1.建立SOCKET服務 7 * 2.建立數據包,用於存儲接收到的數據,方便用數據包中的方法來解析數據 8 * 3.使用Recive方法將接受到的數據存儲到數據包中 9 * 4用數據包中的方法來解析數據 10 * 5關閉SOCKET服務 11 * @throws IOException 12 */ 13 public static void main(String[] args) throws IOException { 14 //1 15 System.out.println("接收端啓動..."); 16 DatagramSocket ds = new DatagramSocket(8000); 17 //2 18 while(true){ 19 byte[] buf = new byte[1024]; 20 DatagramPacket dp = new DatagramPacket(buf,buf.length); 21 //3 22 ds.receive(dp); 23 //4 24 String ip = dp.getAddress().getHostAddress(); 25 int port = dp.getPort(); 26 String text = new String(dp.getData()); 27 System.out.println(ip+":"+port+":"+text); 28 if("over".equals(text)){ 29 ds.close(); 30 } 31 } 32 } 33 }
還可使用實現Runnable接口的方式建立聊天室的多線程
最後是接收方與發送方的交互
3.5TCP協議
須要進行三次握手確認,創建信息傳輸的渠道。如打電話,撥打方問,你在嗎,接收方回答,我在,撥打方再回復,好的,我知道了。而後就能夠進行數據的傳輸了。
//這是服務器端
1 package itcast.p5.text; 2 3 4 import java.io.BufferedReader; 5 import java.io.BufferedWriter; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.InputStreamReader; 9 import java.io.OutputStreamWriter; 10 import java.io.PrintWriter; 11 import java.net.ServerSocket; 12 import java.net.Socket; 13 14 public class TextServer { 15 16 /** 17 * @param args 18 * @throws IOException 19 * 服務端實現思路: 20 * 1創建Socket服務對象 21 * 2對外提供一個端口 22 * 3獲取鏈接過去的客戶端對象 23 * 4輸出轉變後的大寫的數據 24 5關閉資源(Socket服務,socket) 25 */ 26 public static void main(String[] args) throws IOException { 27 //System.out.println("服務器端已啓動"); 28 ServerSocket ss = new ServerSocket(1100); 29 Socket s = ss.accept(); 30 //獲取ip 31 String ip = s.getInetAddress().getHostAddress(); 32 System.out.println(ip+"connect"); 33 //獲取讀取流 34 BufferedReader in = 35 new BufferedReader(new InputStreamReader(s.getInputStream())); 36 37 //輸出流 38 PrintWriter out = 39 new PrintWriter(s.getOutputStream(),true); 40 41 42 String str = null; 43 while((str=in.readLine())!=null){ 44 45 System.out.println(str); 46 out.println(str.toUpperCase()); 47 } 48 s.close(); 49 ss.close(); 50 } 51 }
//客戶端
1 package itcast.p5.text; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.PrintWriter; 7 import java.net.Socket; 8 9 public class TextClient { 10 11 /** 12 * @param args 13 * @throws IOException 14 1 建立tcp客戶端socket服務 15 * 2若是鏈接創建,說明數據通道已鏈接 16 * 3將數據寫出 17 * 4獲取數據 18 5關閉資源 19 */ 20 public static void main(String[] args) throws IOException { 21 System.out.println("客戶端已啓動"); 22 Socket s = new Socket("10.100.1.150",1100); 23 //輸出流 24 BufferedReader br = 25 new BufferedReader(new InputStreamReader(System.in)); 26 PrintWriter out = new PrintWriter(s.getOutputStream(),true); 27 28 BufferedReader in = 29 new BufferedReader(new InputStreamReader(s.getInputStream())); 30 31 String line = null; 32 while((line=br.readLine())!=null){ 33 34 if("end".equals(line)){ 35 System.out.println("客戶端關閉"); 36 break; 37 } 38 out.println(line); 39 String upper =in.readLine(); 40 System.out.println(upper); 41 } 42 43 s.close(); 44 } 45 46 }
另外上傳文件時,服務器端需創建一個文件儲存從客戶端上傳的文件夾中的數據。上傳圖片,沒有用到高級緩衝io流,使用的是inputStream and OutputStream流。
4常見客戶端
瀏覽器:IE
最多見的服務端:
服務器:Tomcat
5
C/S client/server
B/S browser/server