網絡編程

一.概述

1.計算機網絡

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

2.網絡編程

就是用來實現網絡互連的不同計算機上運行的程序間可以進行數據交換。

二.網絡編程三要素

1. Ip

每個設備在網絡中的唯一標識,每臺網絡終端在網絡中都有一個獨立的地址,我們在網絡中傳輸數據就是使用這個地址。

ipconfig:查看本機IP192.168.12.42
ping:測試連接192.168.40.62
本地迴路地址:127.0.0.1 255.255.255.255是廣播地址
IPv4:4個字節組成,4個0-255。大概42億,30億都在北美,亞洲4億。2011年初已經用盡。
IPv6:8組,每組4個16進制數。
1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
1a2b::aaaa:0000:0000:0000:aabb:1f2f
1a2b:0000:aaaa::aabb:1f2f
1a2b:0000:aaaa::0000:aabb:1f2f
1a2b:0000:aaaa:0000::aabb:1f2f

2. Port(端口號)

  • 每個程序在設備上的唯一標識
  • 每個網絡程序都需要綁定一個端口號,傳輸數據的時候除了確定發到哪臺機器上,還要明確發到哪個程序。
  • 端口號範圍從0-65535
  • 編寫網絡應用就需要綁定一個端口號,儘量使用1024以上的,1024以下的基本上都被系統程序佔用了。
  • 常用端口
    • mysql: 3306
    • oracle: 1521
    • web: 80
    • tomcat: 8080
    • QQ: 4000

3.協議

爲計算機網絡中進行數據交換而建立的規則、標準或約定的集合。

分類

  • UDP

    面向無連接,數據不安全,速度快。不區分客戶端與服務端。

  • TCP

    面向連接(三次握手),數據安全,速度略低。分爲客戶端和服務端。 
    三次握手: 客戶端先向服務端發起請求, 服務端響應請求, 傳輸數據

三.Socket通信原理

1.Socket套接字

網絡上具有唯一標識的IP地址和端口號組合在一起才能構成唯一能識別的標識符套接字。

2.Socket通信

通信的兩端都有Socket。

網絡通信其實就是Socket間的通信。

數據在兩個Socket間通過IO流傳輸。

Socket在應用程序中創建,通過一種綁定機制與驅動程序建立關係,告訴自己所對應的IP和port。

四.網絡傳輸之UDP傳輸

1.基本流程

(1)發送Send

創建DatagramSocket, 隨機端口號
創建DatagramPacket, 指定數據, 長度, 地址, 端口
使用DatagramSocket發送DatagramPacket
關閉DatagramSocket
(2)接收Receive

創建DatagramSocket, 指定端口號
創建DatagramPacket, 指定數組, 長度
使用DatagramSocket接收DatagramPacket
關閉DatagramSocket
從DatagramPacket中獲取數據
(3)接收方獲取ip和端口號

String ip = packet.getAddress().getHostAddress();
int port = packet.getPort();

2.代碼示例

public class Demo3_MoreThread {

            /**
             * @param args
             */
            public static void main(String[] args) {
                new Receive().start();

                new Send().start();
            }

        }

        class Receive extends Thread {
            public void run() {
                try {
                    DatagramSocket socket = new DatagramSocket(6666);                   //創建socket相當於創建碼頭
                    DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);   //創建packet相當於創建集裝箱

                    while(true) {
                        socket.receive(packet);                                             //接收貨物
                        byte[] arr = packet.getData();
                        int len = packet.getLength();
                        String ip = packet.getAddress().getHostAddress();
                        System.out.println(ip + ":" + new String(arr,0,len));
                    }
                } catch (IOException e) {

                    e.printStackTrace();
                }
            }
        }

        class Send extends Thread {
            public void run() {
                try {
                    DatagramSocket socket = new DatagramSocket();       //創建socket相當於創建碼頭
                    Scanner sc = new Scanner(System.in);

                    while(true) {
                        String str = sc.nextLine();
                        if("quit".equals(str))
                            break;
                        DatagramPacket packet =                             //創建packet相當於創建集裝箱
                                new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
                        socket.send(packet);            //發貨
                    }
                    socket.close();
                }  catch (IOException e) {

                    e.printStackTrace();
                }
            }
        }

五.網絡傳輸之TCP傳輸

1.基本流程

(1)客戶端

創建Socket連接服務端(指定ip地址,端口號)通過ip地址找對應的服務器
調用Socket的getInputStream()和getOutputStream()方法獲取和服務端相連的IO流
輸入流可以讀取服務端輸出流寫出的數據
輸出流可以寫出數據到服務端的輸入流
(2)服務端

創建ServerSocket(需要指定端口號)
調用ServerSocket的accept()方法接收一個客戶端請求,得到一個Socket
調用Socket的getInputStream()getOutputStream()方法獲取和客戶端相連的IO流
輸入流可以讀取客戶端輸出流寫出的數據
輸出流可以寫出數據到客戶端的輸入流

2.代碼示例

客戶端

        Socket socket = new Socket("127.0.0.1", 9999);      //創建Socket指定ip地址和端口號
        InputStream is = socket.getInputStream();           //獲取輸入流
        OutputStream os = socket.getOutputStream();         //獲取輸出流
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        PrintStream ps = new PrintStream(os);

        System.out.println(br.readLine());
        ps.println("我想報考公務員");
        System.out.println(br.readLine());
        ps.println("這就尷尬了");
        socket.close();
服務端

ServerSocket server = new ServerSocket(9999);   //創建服務器
        while(true) {
            final Socket socket = server.accept();              //接受客戶端的請求
            new Thread() {
                public void run() {
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        PrintStream ps = new PrintStream(socket.getOutputStream());
                        ps.println("歡迎諮詢公務員信息網");
                        System.out.println(br.readLine());
                        ps.println("此次崗位已爆滿");
                        System.out.println(br.readLine());
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章