網絡編程學習筆記

網絡編程

1.一、概述

一、計算機網絡java

計算機網絡是指將==地理位置不一樣==的具備獨立功能的多臺計算機及其外部設備,經過通訊線路鏈接起來,在網絡操做系統,網絡管理軟件及網絡通訊協議的管理和協調下,實現資源共享和信息傳遞的計算機系統。

二、網絡編程的目的:無線電臺...傳播交流信息,數據交換,通訊web

三、想要達到這個效果須要什麼?編程

  1. 如何準確的定位網絡上的一臺主機
  2. 找到這個主機,如何傳輸數據
  3. javaweb:網頁編程 B/S
  4. 網絡編程:TCP/IP C/S

1.二、網絡通訊的要素

如何實現網絡的通訊?bash

通訊雙方地址服務器

  • IP 192.168.0.0:8080網絡

  • 端口號less

    規則:網絡通訊的協議socket

    TCP/IP參考模型:jsp

    ![](D:\0.0 study\紅芯書院\六、網絡編程\picture\TCPIP參考模型.png)tcp

小結:

  1. 網絡編程中的兩個主要的問題
    • 如何準確的定位到網絡上的一臺或者多臺主機
    • 找到主機以後如何進行通訊
  2. 網絡編程中的要素
    • IP和端口號 IP
    • 網絡通訊協議 UDP TCP

1.三、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.四、端口

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

  • 不一樣的進程有不一樣的端口號!用來區分軟件!
  • 被規定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.五、通訊協議

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

網路通訊協議:速率,傳輸碼率,代碼結構,傳輸控制......

問題:複雜

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

TCP/IP協議簇:其實是一組協議

  • TCP:用戶傳輸協議
  • UDP:用戶數據報協議

出名的協議

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

TCP UDP對比

TCP: 打電話

  • 須要鏈接,穩定

  • 三次握手、四次揮手

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

  • 傳輸完成、釋放鏈接、效率低

UDP:發短信

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

1.六、TCP

客戶端

一、鏈接服務器,經過Socket

二、發送消息

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 {
            //一、要知道服務器的地址
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            //二、端口號
            int port =9999;
            //三、建立一個socket鏈接
            socket = new Socket(serverIP,port);
            //三、發送消息
            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();
                }
            }
        }
    }
}

服務端

一、創建服務的窗口,經過ServerSocket

二、等待用戶的鏈接,經過accept

三、接收用的消息

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;

        //一、我有一個地址
        try {
            serverSocket = new ServerSocket(9999);
            //二、等待客戶端鏈接過來
            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 {
        //一、建立服務
        ServerSocket serverSocket = new ServerSocket(9000);
        //二、監聽客戶端的鏈接
        Socket socket = serverSocket.accept();
        //三、獲取輸入流
        InputStream is = socket.getInputStream();
        //四、文件輸出
        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);
        //二、建立一個輸出流
        OutputStream os = socket.getOutputStream();
        //三、讀取一個文件
        FileInputStream files = new FileInputStream(new File("TcpClientDemo01.java"));
        //四、寫出文件
        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());

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

    }
}

1.七、UDP

一、聊天實現

發送方:

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

    }

}

二、在線諮詢:兩我的均可以是發送方,也均可以是接收方!

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

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

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.八、URL下載網絡資源

URL的組成:協議://IP地址:端口號/項目名/資源名

URLDown.java

public class URLDown {
    public static void main(String[] args) throws Exception {
        //一、下載地址
        URL url = new URL("http://m701.music.126.net/20210324121008/fa40047aca19fe4a2639d56aa8b652b2/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/5546003493/cfbc/699a/fadc/6b094e5431dfc70cb57527f51db8dd4c.mp3");
        //二、鏈接到這個服務器
        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());//參數
    }
}
相關文章
相關標籤/搜索