Socket網絡編程

網絡編程總結(按照視頻順序):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

相關文章
相關標籤/搜索