網路程式設計學習筆記

部落格zhu虎康 發表於 2021-04-05

網路程式設計

1.1、概述

1、計算機網路

    計算機網路是指將==地理位置不同==的具有獨立功能的多臺計算機及其外部裝置,通過通訊線路連線起來,在網路作業系統,網路管理軟體及網路通訊協議的管理和協調下,實現資源共享和資訊傳遞的計算機系統。

2、網路程式設計的目的:無線電臺...傳播交流資訊,資料交換,通訊

3、想要達到這個效果需要什麼?

  1. 如何準確的定位網路上的一臺主機
  2. 找到這個主機,如何傳輸資料
  3. javaweb:網頁程式設計 B/S
  4. 網路程式設計:TCP/IP C/S

1.2、網路通訊的要素

如何實現網路的通訊?

通訊雙方地址

  • IP 192.168.0.0:8080

  • 埠號

    規則:網路通訊的協議

    TCP/IP參考模型:

    ![](D:\0.0 study\紅芯書院\6、網路程式設計\picture\TCPIP參考模型.png)

小結:

  1. 網路程式設計中的兩個主要的問題
    • 如何準確的定位到網路上的一臺或者多臺主機
    • 找到主機之後如何進行通訊
  2. 網路程式設計中的要素
    • IP和埠號 IP
    • 網路通訊協議 UDP TCP

1.3、IP

  • ip地址:InetAddress
  • 唯一定位一臺網路上的計算機
  • 127.0.0.1:本機locallhost
  • ip地址的分類
    • ipv4/ipv6
      • IPV4 127.0.0.1 4個位元組組成。0-255
      • IPV6 fe80::cd8c:14a:6388:7c1c%12,128位,8個無符號整數!
    • 公網(網際網路)-- 私網(區域網)
      • ABCD類地址
      • 192.168.xx.xx,專門給組織內部使用的
  • 域名:記憶IP問題!
    • IP:www.vip.com

1.4、埠

埠表示計算機上的一個程式的程式

  • 不同的程式有不同的埠號!用來區分軟體!
  • 被規定0--65535
  • TCP,UDP:65535*2。TCP:80,UDP:80?Y
  • 單個協議下,埠號不能衝突
  • 埠分類
    • 公有埠0--1023
      • HTTP:80
      • HTTPS:443
      • FTP:21
      • Telent:23
    • 程式註冊埠:1024~49151,分配使用者或程式
      • Tomcat:8080
      • MySQL:3306
      • Oracle:1521
    • 動態、私有:19152~65535
netstat -ano#檢視所用的埠
netstat -ano|findstr "5900"  #管道符的作用,用來做分割,先把後邊的執行完後代入前邊進行執行。。。。檢視指定的埠
tasklist|findstr "指定埠的程式"
ctr+shift+esc  開啟工作管理員 
package com.lessonweb.net;

import java.net.InetSocketAddress;

public class TsetInetSocketAdress {
    public static void main(String[] args) {
        InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1",8080);
        InetSocketAddress socketAddress2 = new InetSocketAddress("localhost",8080);
        System.out.println(socketAddress);
        System.out.println(socketAddress2);

        System.out.println(socketAddress.getAddress());
        System.out.println(socketAddress.getHostName());//地址
        System.out.println(socketAddress.getPort());//埠
    }
}

1.5、通訊協議

協議:約定,就好比人與人之間的普通話

網路通訊協議:速率,傳輸位元速率,程式碼結構,傳輸控制......

問題:複雜

解決方式:大事化小:分層!

TCP/IP協議簇:實際上是一組協議

  • TCP:使用者傳輸協議
  • UDP:使用者資料包協議

出名的協議

  • TCP協議
  • IP協議:網路互連協議

TCP UDP對比

TCP: 打電話

  • 需要連線,穩定

  • 三次握手、四次揮手

    最少需要三次,保證穩定連線!
    A:你瞅啥?
    B:瞅你咋地?
    A:幹一場!
    
    
    
    A:我要走了!
    B:真的要走了嗎?
    B:真的真的要走了嗎?
    A:我真的要走了!
    
  • 客戶端、服務端

  • 傳輸完成、釋放連線、效率低

UDP:發簡訊

  • 不連線,不穩定
  • 客戶端、服務端,沒有明確的界限
  • 不算有沒有準備好,都可以發給你
  • 類似於導彈,不需要詢問對方
  • DDOS:洪水攻擊(飽和攻擊)

1.6、TCP

客戶端

1、連線伺服器,通過Socket

2、傳送訊息

package com.lessonweb.tcp;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClientDemo01 {
    public static void main(String[] args) {
Socket socket= null;
OutputStream os = null;
        try {
            //1、要知道伺服器的地址
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            //2、埠號
            int port =9999;
            //3、建立一個socket連線
            socket = new Socket(serverIP,port);
            //3、傳送訊息
            os = socket.getOutputStream();
            os.write("你好,網路程式設計".getBytes());

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (os!=null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket!=null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

服務端

1、建立服務的視窗,通過ServerSocket

2、等待使用者的連線,通過accept

3、接收用的訊息

package com.lessonweb.tcp;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServerDemo01 {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;

        //1、我有一個地址
        try {
            serverSocket = new ServerSocket(9999);
            //2、等待客戶端連線過來
            socket = serverSocket.accept();
            //讀取客戶端的訊息
            is = socket.getInputStream();

            //管道流
            baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) != -1) {
                baos.write(buffer, 0, length);

            }
            System.out.println(baos.toString());


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //關閉資源
            if (baos != null) {
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

}

檔案上傳

伺服器端

package com.lessonweb.tcp;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServerDemo02 {
    public static void main(String[] args) throws Exception {
        //1、建立服務
        ServerSocket serverSocket = new ServerSocket(9000);
        //2、監聽客戶端的連線
        Socket socket = serverSocket.accept();
        //3、獲取輸入流
        InputStream is = socket.getInputStream();
        //4、檔案輸出
        FileOutputStream fos = new FileOutputStream(new File("receive"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer))!=-1){
            fos.write(buffer,0,len);

        }
        //通知客戶端我接受完畢了
        OutputStream os = socket.getOutputStream();
        os.write("我已經接收完畢了,你可以退出了!".getBytes());


        //關閉資源
        os.close();
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();



    }
}

客戶端

package com.lessonweb.tcp;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClientDemo02 {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
        //2、建立一個輸出流
        OutputStream os = socket.getOutputStream();
        //3、讀取一個檔案
        FileInputStream files = new FileInputStream(new File("TcpClientDemo01.java"));
        //4、寫出檔案
        byte[] buffer = new byte[1024];
        int len;
        while((len = files.read())!=1){
            os.write(buffer,0,len);

        }
        //通知伺服器。我已經結束了
        socket.shutdownOutput();//我已經傳輸完了

        //確定伺服器接收完畢  才能夠斷開連線
        InputStream inputStream = socket.getInputStream();

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] buffer2 = new byte[1024];
        int len2;
        while ((len2=inputStream.read())!=-1){
            baos.write(buffer2,0,len2);
        }
        System.out.println(baos.toString());

        //5、關閉
        baos.close();
        inputStream.close();
        files.close();
        os.close();
        socket.close();

    }
}

1.7、UDP

1、聊天實現

傳送方:

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();
    }
}

接收方:

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 receiveData = new String(data, 0, data.length);
            System.out.println(receiveData);
            if (receiveData.equals("bye")){
                break;
            }

        }
        socket.close();

    }

}

2、線上諮詢:兩個人都可以是傳送方,也都可以是接收方!

Receive:

public class TalkReceive implements Runnable{
    DatagramSocket socket =null;
    private int port;
    private  String msgFrom;

    public TalkReceive(int port,String msgFrom) {
        this.port = port;
        this.socket = socket;
        this.msgFrom = msgFrom;
        try {
            socket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }


    @Override
    public void run() {
            while (true){
                try {
                    //準備接受包裹
                    byte[] container = new byte[1024];
                    DatagramPacket packet = new DatagramPacket(container,0,container.length);
                    try {
                        socket.receive(packet);//接收包裹
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    //斷開連線
                    byte[] data = packet.getData();
                    String receiveData = new String(data, 0, data.length);
                    System.out.println(msgFrom+":"+receiveData);
                    if (receiveData.equals("bye")){
                        break;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        socket.close();
    }

}

Send:

public class TalkSend implements Runnable{
    DatagramSocket socket = null;
    BufferedReader reader = null;
    private int fromPort;
    private String toIP;
    private int toPort;
    public TalkSend(int fromPort,String toIP,int toPort ) {
        this.fromPort= fromPort;
        this.toIP = toIP;
        this.toPort = toPort;
        try{
            socket=new DatagramSocket(fromPort);
            reader=new BufferedReader(new InputStreamReader(System.in));
        }catch(Exception e){
            e.printStackTrace();
        }
    }


    @Override
    public void run() {
        while (true){
            try {
                String data = reader.readLine();
                byte[] datas = data.getBytes();
                DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIP, this.toPort));
                socket.send(packet);
                if (data.equals("bye")) {
                    break;
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

3、簡單案例的實現:師生對話交流

Student:

public class TalkStudent {
    public static void main(String[] args) {
        //開啟兩個執行緒
        new Thread(new TalkSend(777,"localhost",9999)).start();
        new Thread(new TalkReceive(8888,"老師")).start();

    }
}

Teacher:

public class TalkTeacher {
    public static void main(String[] args) {

        new Thread(new TalkSend(5555,"localhost",8888)).start();
        new Thread(new TalkReceive(9999,"學生")).start();
    }
}

1.8、URL下載網路資源

URL的組成:協議://IP地址:埠號/專案名/資源名

URLDown.java

public class URLDown {
    public static void main(String[] args) throws Exception {
        //1、下載地址
        URL url = new URL("http://m701.music.126.net/20210324121008/fa40047aca19fe4a2639d56aa8b652b2/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/5546003493/cfbc/699a/fadc/6b094e5431dfc70cb57527f51db8dd4c.mp3");
        //2、連線到這個伺服器
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
        InputStream inputStream = urlConnection.getInputStream();
        FileOutputStream fos = new FileOutputStream("錯位時空.mp3");
        byte[] buffer = new byte[1024];
        int len;
        while ((len=inputStream.read(buffer))!=-1){
            fos.write(buffer,0, len);//寫出這個資料
        }
        fos.close();
        inputStream.close();
        urlConnection.disconnect();
    }
}
public class URLDemo {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=kuang&passwoed=123");
        System.out.println(url.getProtocol());//協議
        System.out.println(url.getHost());//主機IP
        System.out.println(url.getPort());//埠
        System.out.println(url.getPath());//全路徑
        System.out.println(url.getFile());//檔案
        System.out.println(url.getQuery());//引數
    }
}