天天看點

狂神網絡程式設計學習筆記網絡程式設計

網絡程式設計

概述

計算機網絡

​ 電腦網絡是将地理位置不同的具有獨立功能的多台計算機及其外部裝置,通過通信線路連接配接起來,在網絡作業系統,網絡管理軟體及網絡通信協定的管理和協商下,實作資源共享和資訊傳遞功能的計算機系統

網絡程式設計的目的

資料交換,通信

想要達到這個效果需要什麼:

  1. 如何準确地定位網絡上的一台主機:IP位址和端口,定位到這個計算機上的某些資源
  2. 找到了主機。怎麼傳輸資料?

    TCP/IP通信

網絡通信的要素

如何實作網絡的通信?

​ 通信雙方的位址:

  • IP
  • 端口号

規則:網絡通信協定

​ TCP/IP參考模型:

狂神網絡程式設計學習筆記網絡程式設計

小結

  1. 網絡程式設計中有兩個主要的問題
    • 如何準确的定位到網絡上的一台或者多台主機
    • 找到主機之後如何進行通信
  2. 網絡程式設計中的要素
    • IP和端口号
    • 網絡通信協定:UDP,TCP
  3. 萬物皆對象

IP

IP位址:InetAddress

  • 唯一的定位一台網絡上的計算機
  • 127.0.0.1:本機
  • IP位址的分類
    • IP位址分類: IPV4 / IPV6
      • IPV4: 127.0.0.1,四個位元組組成,0-255,大概42億個,30億都在北美亞洲4億,2011年用盡
      • IPV6:128位,8個無符号整數
        2001:2bb2:0015:2222:000:1aaaa:1312
                   
    • 公網(網際網路) 和 私網(區域網路)
      • ABCD類位址
      • 192.168.xx.xx,專門給組織内部隻用的
  • 域名:記憶IP問題!
    • IP:

端口

端口表示計算機上的一個程式的程序

  • 不同的程序有不同的端口号!(端口号不能重複,用來區分軟體)
  • 被規定0-65535
  • TCP,UDP,單個協定下,端口号不能重複
  • 端口分類
    • 共有端口 0-1023
      • HTTP:80
      • Https:443
      • FTP:21
      • Telent:23
    • 程式注冊端口:1024-49151,配置設定給使用者或者程式
      • Tomcat :8080
      • MySQL:3360
      • Oracle:1521
    • 動态端口:49152-65535

通信協定

協定:約定,就還比我們現在說的是國語

網絡通信協定:速率,傳輸碼率,代碼結構,傳輸控制

TCP/IP協定簇

重要:

  • TCP:使用者傳輸協定
  • UDP:資料傳輸報協定

出名的協定:

  • TCP:
  • IP:網絡互連協定

TCP UDP對比

TCP:打電話

  • 連接配接穩定
  • 三次握手,四次揮手
    三次握手,四次揮手
    
    最少需要三次,保證穩定連接配接
    A:你瞅啥
    B:瞅你咋地
    A:幹一架
    
    
    A:我要走了
    B:你真的要走了嗎
    B:你真的真的要走了嗎
    A:我真的要走了
               
  • 用戶端,服務端
  • 傳輸完成釋放連接配接,效率低

UDP:發短信

  • 不連接配接,不穩定
  • 用戶端,服務端:沒有明确的解限
  • 不管有沒有準備好都可以發給你

TCP

用戶端:

  1. 連接配接伺服器
  2. 發送消息

伺服器

  1. 建立服務的端口 ServerSocket
  2. 等待使用者的連接配接 accept
  3. 接受使用者的消息

檔案上傳

  1. 伺服器端
  2. 用戶端

UDP

發送消息

發短信:不用連接配接,但是要知道對方的位址

發送端

package com.kele.lesson03;

//不需要連接配接伺服器

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UdpClientDemo01 {
    public static void main(String[] args) throws Exception {
        //1.建立一個Scoket
        DatagramSocket socket = new DatagramSocket();
        //2.建個包
        String msg = "你好啊,kele";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;

        //資料,資料的起始位置,要發送的位址和端口号
        DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
        //3.發送包
        socket.send(packet);
        //關閉流
        socket.close();
    }
}

           

接收端

package com.kele.lesson03;

//等待用戶端的連接配接

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpServerDemo01 {
    public static void main(String[] args) throws Exception {
        //開放端口
        DatagramSocket socket = new DatagramSocket(9090);
        //接受資料包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

        socket.receive(packet);//阻塞接收

        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(), 0, packet.getLength()));

        //關閉流
        socket.close();
    }
}

           

咨詢

實作循環發送接受消息

發送方
package com.kele.chat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class UdpSenderDemo01 {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(8888);

        //準備資料
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        while (true){
            String data = reader.readLine();
            byte[] datas = data.getBytes();
            DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 6666));

            socket.send(packet);
            if (data.equals("bye")){
                break;
            }
        }
        socket.close();
    }
}

           
接收方
package com.kele.chat;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpReceiveDemo01 {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(6666);

        while (true){
            //準備接受包裹
            byte[] container = new byte[1024];
            DatagramPacket packet = new DatagramPacket(container, 0, container.length);
            socket.receive(packet);

            //顯示接收的資料
            byte[] data = packet.getData();
            String receiceData = new String(data, 0, data.length);
            System.out.println(receiceData);
            if (receiceData.equals("bye")){
                break;
            }
        }
        socket.close();
    }
}

           

線上咨詢

實作雙方都可以發送和接收

代碼在F:\code\java_code\NET\study\src\com\kele\chat這裡

URL

概念

​ 統一資源定位符:定位資源的,定位網際網路上的某一個資源

​ 可以定義一個類去下載下傳網絡上的資源:

package com.kele.lesson04;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class UrlDown {
    public static void main(String[] args) throws Exception {
        //下載下傳位址
        URL url = new URL("http://localhost:8080/kele/jimiwenjian.txt");
        //2.連接配接到這個資源
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        InputStream inputStream = urlConnection.getInputStream();

        FileOutputStream fos = new FileOutputStream("jimiwenjian.txt");

        byte[] buffer = new byte[1024];
        int len;
        while ((len = inputStream.read(buffer)) != -1){
            fos.write(buffer, 0, len);//寫出這份資料
        }
        fos.close();
        inputStream.close();
        urlConnection.disconnect();
    }
}