Socket網絡編程 1

Socket網絡編程

什麼是網絡編程

網絡,計算機網絡的構成?

在計算機領域中,網絡是信息傳輸、接收、共享的虛擬平臺。
局域網、互聯網

什麼是網絡編程?

對信息的發送和接收。通過操作相關Api調度計算機硬件資源,並利用傳輸管道(網線)進行數據交換的過程。

網絡模型、套接字、數據包

7層網絡模型-OSI

Sending Computer Reveiving Computer
Application Application
Presentation Presentation
Session Session
Transport Transport
Network Network
Data Link Data Link
Physical Data Transfter-> Physical

基礎層:物理層(Physical),數據鏈路層(Datalink)、網絡層(Network)
傳輸層(Transport):TCP-UDP 協議層、Socket
高級層:會話層(Session),表示層(Presentation),應用層(Application)

Telnet FTP SMTP DNS RIP SNMP
TCP UDP
ARP IP IGMP ICMP
Ethernet | Token Ring |Frame Relay |ATM

Socket 與 TCP、UDP

What is Socket?

  • 簡單來說就是IP地址與端口的結合協議(RFC 793)
  • 一種地址與端口的結合描述協議
  • TCP/IP 協議的相關API的總稱,是網絡API的集合實現
  • 涵蓋了:Stream Socket/Datagram Socket

Socket 的作用與組成

  • 在網絡傳輸中用於唯一標示兩個端點之間的鏈接
  • 端點:包括(IP + Port)

Socket 之TCP

  • TCP是面向連接的通信協議
  • 通過三次握手建立連接,通訊完成時要拆除連接
  • 由於TCP是面向連接的,所以只能用於端到端的通訊

Socket 之UDP

  • UDP是面向無連接的通訊協議
  • UDP數據包括目的端口號和源端口號信息
  • 由於通訊不需要連接,所以可以實現廣播發送,並不侷限於端到端

TCP傳輸

-----TCP Data ---->
<----TCP ACK ----

UDP 傳輸

----UDP Data----->

Client-Server Application

  • TCP/IP協議中,兩個進程間通信的主要模式爲:CS模型
  • 主要目的:協同網絡中的計算機資源,服務模式,進程間數據共享

Socket TCP 小試牛刀

  • 構建TCP客戶端、服務端
  • 客戶端發送數據
  • 服務器讀取數據並打印

首先啓動服務端: java Server
然後啓動客戶端: java Client

Server

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public Server() {
    }

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(2000);
        System.out.println("服務器準備就緒~");
        System.out.println("服務端信息:" + server.getInetAddress() + "P:" + server.getLocalPort());

        while(true) {
            Socket client = server.accept();
            Server.ClientHandler clientHandler = new Server.ClientHandler(client);
            clientHandler.start();
        }
    }

    private static class ClientHandler extends Thread {
        private Socket socket;
        private boolean flag = true;

        ClientHandler(Socket socket) {
            this.socket = socket;
        }

        public void run() {
            super.run();
            System.out.println("新客戶端連接:" + this.socket.getInetAddress() + "P:" + this.socket.getPort());

            try {
                PrintStream socketOutput = new PrintStream(this.socket.getOutputStream());
                BufferedReader socketinput = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));

                do {
                    String str = socketinput.readLine();
                    if ("bye".equalsIgnoreCase(str)) {
                        this.flag = false;
                        socketOutput.println("bye");
                    } else {
                        System.out.println(str);
                        socketOutput.println("回送:" + str.length());
                    }
                } while(this.flag);

                socketinput.close();
                socketOutput.close();
            } catch (Exception var12) {
                System.out.println("連接異常斷開");
            } finally {
                try {
                    this.socket.close();
                } catch (IOException var11) {
                    var11.printStackTrace();
                }

            }

            System.out.println("客戶端已退出:" + this.socket.getInetAddress() + "P:" + this.socket.getPort());
        }
    }
}

Client

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {
    public Client() {
    }

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket();
        socket.setSoTimeout(3000);
        socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000), 3000);
        System.out.println("已發起服務器連接,進入後續流程~");
        System.out.println("客戶端信息:" + socket.getLocalAddress() + "P:" + socket.getLocalPort());
        System.out.println("服務端信息:" + socket.getInetAddress() + "P:" + socket.getPort());

        try {
            todo(socket);
        } catch (Exception var3) {
            System.out.println("異常關閉");
        }

        socket.close();
        System.out.println("客戶端已退出~");
    }

    private static void todo(Socket client) throws IOException {
        InputStream in = System.in;
        BufferedReader input = new BufferedReader(new InputStreamReader(in));
        OutputStream outputStream = client.getOutputStream();
        PrintStream socketPrintStream = new PrintStream(outputStream);
        InputStream inputStream = client.getInputStream();
        BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        boolean flag = true;

        do {
            String str = input.readLine();
            socketPrintStream.println(str);
            String echo = socketBufferedReader.readLine();
            if ("bye".equalsIgnoreCase(echo)) {
                flag = false;
            } else {
                System.out.println(echo);
            }
        } while(flag);

        socketPrintStream.close();
        socketBufferedReader.close();
    }
}

報文、協議、Mac地址

報文段

  • 報文段是指TCP/IP協議網絡傳輸過程中,起着路由導航作用
  • 用以查詢各個網絡路由網段、IP地址、交換協議等IP數據包
  • 報文在傳輸過程中會不斷地封裝成分組、包、幀來傳輸
  • 封裝方式就是添加一些控制信息組成的首部,即報文頭
    傳輸協議
    MAC地址
  • Media Access Control 或者Medium Access Control
  • 意譯爲媒體訪問控制,或稱爲物理地址、硬件地址
  • 用來定義網絡設備的位置。

IP、端口、遠程服務器

IP地址

  • 互聯網協議地址(Internet Protocol Address,又譯爲網際協議地址),縮寫爲IP地址

  • 是分配給網絡上使用網際協議(Internet Protocol ,IP)的設備的數字標籤

  • 常見的IP地址分爲Ipv4與IPv6兩大類
    IP地址-IPv4

  • Ip地址由32位二進制數組成,常以 xxx.xxx.xxx.xxx形式表現

  • 分爲A、B、C、D、E五大類,其中E屬於特殊保留地址

  • 總數量:42億個;已於2011年2月3日用盡

  • 如果主機號全是1,那麼這個地址爲直接廣播地址

  • IP地址 “255.255.255.255”爲受限廣播地址
    IP地址-IPv6

  • 總有128位長,IPv6地址的表達形式,一般採用32個十六進制數。也可想象爲1632個

  • 由兩個邏輯部分組成:一個64位 的網絡前綴和一個64位的主機地址,主機地址通常根據物理地址自動生成,叫做EUI-64(或者64位拓展唯一標識
    端口

  • 如果把IP地址比作一間房子,端口就是出入這間房子的門或者窗戶

  • 在不同窗戶後有不同的人,房子中的用戶與外界交流的出口

  • 外界鴿子(信息)飛到不同窗口也就是給不同的人傳遞信息

  • 0到1023號端口以及1024到49151號端口都是特殊端口

Service,Protocol,or Application Port Number TCP or UDP
FTP 20,21 TCP
SSH 22 TCP
Telnet 23 TCP
SMTP 25 TCP
DNS 53 UDP
TFTP 69 UDP
HTTP 80 TCP
POP3 110 TCP
IMAP4 143 TCP
HTTPS 443 TCP
  • 計算機之間依照互聯網傳輸層 TCP/IP協議的協議通信,不同的協議都對應着不同的端口
  • 49152到65535端口屬於“動態端口”範圍,沒有端口可以被正式地註冊佔用。
    在這裏插入圖片描述
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章