java基礎_13_網絡協議 (UDP_TCP)

網格編程

網絡編程的目的就是指直接或間接地通過網絡協議與其它計算機進行通訊。

網絡協議共分七層(ISO/OSI):

7,應用層

6,表示層

5,會話層

4,傳輸層

3,網絡層

2,數據鏈路層

1,物理層

 

其中:傳輸層是整個協議層次結構的核心。

各層之間是嚴格單向依賴。

上層使用下層提供的服務。

下層向上層提供服務。

協議:爲網絡中進行數據交換而建立的規則、標準或約定。

 

網絡傳輸

分爲:面向連接和非連接的服務。

主要傳輸途徑:TCP傳輸(面向連接)和UDP傳輸(無連接)

 

傳輸通過網絡地址(IP)實現。

IP地址:因特網上具有全球唯一性。

分:IPV4  IPV6

 

端口:用來區分一臺機器上的某一個程序。在0--65535 之間,其中0--1024的端口號一般被應用程 序佔用了。

確定好IP地址和程序端口號,兩個程序就可以通訊了。

 

TCP傳輸:

TCP 是Transfer Control Protocol的簡稱,是一種面向連接的可靠傳輸協議。

採用三次握手,須要進行連接,連接成功後才能進行數據傳輸。 但效率低。

 

TCP分客戶端和服務端

客戶端對應的對象是 Socket

服務端對應的對象是 ServerSocket

客戶端建立過程:

1,建立Socket 服務,指定要連接主機的端口

      如:Socket s = new Socket("192.168.0.101",10004);

 

2,獲取socket流中的輸出流,將數據寫到該流中,通過網絡發送給服務端(寫數據)。

      如:OutputStream out = s.getOutputStream();

              out.write("服務端,你好?".getBytes());

 

        使用高效方法:

       BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

        bufw.write(你好);

        bufw.newLine();  //這個行結束符在這很重要,否接收端無法判斷行是否結束,會一直等待。

        bufw.flush();

 

       注意

        1),在使用高效傳送時,每寫一次,記得刷新一下,不然還存在於緩衝池中,直到關閉   才自動刷新。如:在傳送文件時。

        2),bufw.newLine();  行結束符,這句的重要性。

        3),在數據傳送完時,要使用s.shutdownOutput(); 標記,否則服務端無法知道數據是否   傳送完。

        4),這裏可以使用打印流,PrintStream ,會自動刷新等,在這裏使用很方便。

       心得:因爲是往外傳數據,所以應該是往外寫數據。所以使用

 

3,獲取socket流中的輸入流,將服務端反饋的數據獲取到(讀數據)。

如:InputStream in = s.getInputStream();

  byte[] buf = new byte[1024];

  int len = in.read(buf); //阻塞式,沒有讀到數據時會等待。

  System.out.println(new String(buf,0,len));

 

4,關閉客戶端資源。

  s.close(); 

 

服務端建立過程:

1,建立服務端Socket 服務,並監聽一個端口

      如:ServerSocket ss = new ServerSocket(10004);

 

2,通過accept方法獲取連接過來的客戶端對象

      如:Socket s = ss.accept();

 

3,獲取客戶端發送過來的數據,使用服務端對象的讀取流來讀取數據(讀數據)。

      如:InputStream in = s.getInputStream();

              byte[] buf = new byte[1024];

              int len = in.read(buf);  //阻塞式,等待讀數據

              System.out.println(ip+"..."+new String(buf,0,len));

 

4,服務端向客戶端發送數據(寫數據)

       如:OutputStream out = s.getOutputStream();

               out.write("客戶端,你也好。".getBytes());

       注意:傳送數據,在數據寫出去後,都別忘記刷新一下。

 

5,關閉服務端資源。

       s.close();

        ss.close();

 

例:如何讓服務端同時可以接收多個客戶端發送過來的數據呢?

       只須把服務端做成多線程,來一個客戶端就開起一個線程,讓服務端處於一直接收狀態。

       網站就是這樣做的,同時可以多個不同的人訪問該網站(即服務器)。

 

服務端實現線程

  class ServerThread implements Runnable  { }

   服務端一直接收:

    while (true)

    {

          Socket s = ss.accept();  //有阻塞作用

          new Thread(new ServerThread(s)).start(); //進來一個開啓一個線程

    }

   實例:模擬聊天軟件,實現兩個人互聊。

 

UDP傳輸:

UDP是User Datagram  Protocol的簡稱,是一種無連接的協議。

無須建立連接,有數據就發送,效率高。因無連接,所以是不可靠協議。

 

發送端的建立

1,建立udpsocket服務

   //發送服務端口號可以自己設定,也可以不用設,使用默認的。自動分配

   DatagramSocket ds = new DatagramSocket();

 

2,提供數據,並將數據封裝到數據包中DatagramPacket )

   //把信息發送ip192.168.0.103 的主機。程序端口號爲10001

   //如果改爲192.168.0.255 (最後一個數改爲255,就是廣播發送,可以實現羣聊)。

   DatagramPacket dp = new DatagramPacket(bt,0,bt.length,InetAddress.getByName("192.168.0.103"),10001);

 

3,通過socket服務的發送功能,將數據包發出去

   ds.send(dp);

 

4,關閉資源。

 

接收端的建立:

1,建立udp服務(明確接收的端口號)

      DatagramSocket ds = new DatagramSocket(10001); //接收來自端口10001的信息

 

2,定義一個數據包,用來保存接收到的數據包

      byte[] by = new byte[1024];

      DatagramPacket dp = new DatagramPacket(by,0,by.length);

 

3,把接收到的數據包,保存到定義好的數據包中。

      ds.receive(dp); //阻塞方式

 

4,通過數據包對象的特有功能,將數據包裏的數據取出。

      String date = new String(dp.getData(),0,dp.getLength());

 

5,關閉資源。

 

注意:在使用中客戶端和服務端都出現等待情況,這是因爲它們都有其阻塞方法。

心得:在網絡中一般使用UDP傳輸,因爲效率高,使用UDP傳輸,可以實現廣播傳輸。


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