1. 程式人生 > >Java網路程式設計-你是GG還是MM?

Java網路程式設計-你是GG還是MM?

第六階段 網路程式設計

每一臺計算機通過網路連線起來,達到了資料互動的效果,而網路程式設計所解決的問題就是如何讓程式與程式之間實現資料的通訊與互動

在嗎?你是GG還是MM?

(一) 網路模型概述

(1) 兩大模型

網路模型一般是指:

  • OSI(Open System Interconnection開放系統互連)參考模型
  • TCP/IP參考模型

(2) 網路模型七層概述

  1. 物理層:主要定義物理裝置標準,如網線的介面型別、光纖的介面型別、各種傳輸介質的傳輸速率等。它的主要作用是傳輸位元流(就是由1、0轉化為電流強弱來進行傳輸,到達目的地後在轉化為1、0,也就是我們常說的數模轉換與模數轉換)。這一層的資料叫做位元

  2. 資料鏈路層:主要將從物理層接收的資料進行MAC地址(網絡卡的地址)的封裝與解封裝。常把這一層的資料叫做幀。在這一層工作的裝置是交換機,資料通過交換機來傳輸。

  3. 網路層:主要將從下層接收到的資料進行IP地址(例192.168.0.1)的封裝與解封裝。在這一層工作的裝置是路由器,常把這一層的資料叫做資料包

  4. 傳輸層:定義了一些傳輸資料的協議和埠號(WWW埠80等),如:TCP(傳輸控制協議,傳輸效率低,可靠性強,用於傳輸可靠性要求高,資料量大的資料),UDP(使用者資料報協議,與TCP特性恰恰相反,用於傳輸可靠性要求不高,資料量小的資料,如QQ微信聊天資料就是通過這種方式傳輸的)。 主要是將從下層接收的資料進行分段和傳輸

    到達目的地址後再進行重組。常常把這一層資料叫做段

  5. 會話層:通過傳輸層(埠號:傳輸埠與接收埠)建立資料傳輸的通路。主要在你的系統之間發起會話或者接受會話請求(裝置之間需要互相認識可以是IP也可以是MAC或者是主機名)

  6. 表示層:主要是進行對接收的資料進行解釋、加密與解密、壓縮與解壓縮等(也就是把計算機能夠識別的東西轉換成人能夠能識別的東西(如圖片、聲音等)。

  7. 應用層: 主要是一些終端的應用,比如說FTP(各種檔案下載),WEB(IE瀏覽),QQ之類的(可以把它理解成我們在電腦螢幕上可以看到的東西.就是終端應用)。

(二) 網路程式設計三要素

(1) IP地址

A:IP地址概述:IP地址是網路中計算機的唯一標識**

我們應該或多或少都有見過IP地址的格式 xxx.xxx.xxx.xxx大致應該是類似這樣的,但是計算機不是隻能識別二進位制的資料,但是很顯然,我們的IP地址確實不是二進位制的,這是什麼原因呢?

我們先隨便拿一個IP地址舉個例子看看

IP:192.168.1.100

換算:11000000 10101000 00000001 01100100

但是如果我們日後需要用到這個IP地址的時候,記憶起來就比較麻煩,所以,為了方便表示IP地址,我們就把IP地址的每一個位元組上的資料換算成十進位制,然後用 ' . ' 分開來表示:"點分十進位制"

B:IP地址的組成:網路號段+主機號段

A類:第一號段為網路號段+後三段的主機號段,一個網路號:256256256 = 16777216

B類:前二號段為網路號段+後二段的主機號段,一個網路號:256*256 = 65536

C類:前三號段為網路號段+後一段的主機號段,一個網路號:256

C:IP地址的分類

A類

1.0.0.1---127.255.255.254    
(1)10.X.X.X是私有地址(私有地址就是在網際網路上不使用,而被用在區域網絡中的地址)               
(2)127.X.X.X是保留地址,用做迴圈測試用的

B類

128.0.0.1---191.255.255.254    
172.16.0.0---172.31.255.255是私有地址
169.254.X.X是保留地址

C類

192.0.0.1---223.255.255.254    192.168.X.X是私有地址

D類

224.0.0.1---239.255.255.254

E類

240.0.0.1---247.255.255.254

兩個DOS命令

ipconfig 檢視本機ip地址

ping 後面跟ip地址, 測試本機與指定的ip地址間的通訊是否有問題

特殊IP地址

127.0.0.1 迴環地址(表示本機)//也就是說,ping本機的IP地址相當於ping 127.0.0.1

x.x.x.255 廣播地址

x.x.x.0 網路地址

InetAddress的成員方法

//根據主機名或者IP地址的字串表示得到IP地址物件
public static InetAddress getByName(String host):
import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAddressDemo {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress address = InetAddress.getByName("192.168.24.1");

        //獲取兩個東西:主機名,IP地址
        String name = address.getHostName();
        String ip = address.getHostAddress();

        System.out.println(name + "---" + ip);
    }
}

//執行結果
LAPTOP-5T03DV1G---192.168.24.1

(2) 埠

  • 物理埠 網絡卡口

  • 邏輯埠 我們指的就是邏輯埠

    • 每個網路程式都會至少有一個邏輯埠

    • 用於標識程序的邏輯地址,不同程序的標識

    • 有效埠:0~65535,其中0~1024系統使用或保留埠。

(3) 協議

TCP:傳輸控制協議,傳輸效率低,可靠性強,用於傳輸可靠性要求高,資料量大的資料

UDP:使用者資料報協議,與TCP特性恰恰相反,用於傳輸可靠性要求不高,資料量小的資料,如QQ微信聊天資料就是通過這種方式傳輸的

簡單總結

TCP:建立資料通道,無限制,效率低,可靠

UDP:資料打包,有限制,不連線,效率高,不可靠

(三) 控制檯簡單聊天案例

(1) UDP版本 V1.0

import java.io.IOException;
import java.net.*;

/*  UDP協議傳送資料:
 *     A:建立傳送端Socket物件
 *     B:建立資料,並把資料打包
 *     C:呼叫Socket物件的傳送方法傳送資料包
 *     D:釋放資源
 */
public class SendDemo {
    public static void main(String[] args) throws IOException {
        //建立socket物件
        DatagramSocket ds = new DatagramSocket();

        //建立資料,並把資料打包
        //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
        byte[] bys = "Hello,BWH!".getBytes();//把字串轉換成字元陣列
        int length = bys.length;
        InetAddress address = InetAddress.getByName("192.168.24.1");
        int port = 10086; //自擬
        DatagramPacket dp = new DatagramPacket(bys, length, address, port);

        //呼叫Socket物件的方法傳送資料包
        //public void send(DatagramPacket p)
        ds.send(dp);

        //釋放資源
        ds.close(); //底層依賴IO流,所以要釋放資源
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/*
 *  UDP協議接收資料:
 *      A:建立接收端Socket物件
 *      B:建立一個數據包(接收容器)
 *      C:呼叫Socket物件的接收方法接收資料
 *      D:解析資料包,並顯示在控制檯
 *      E:釋放資源
 */
public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        // 建立接收端Socket物件
        // DatagramSocket(int port)
        DatagramSocket ds = new DatagramSocket(10086);

        // 建立一個數據包(接收容器)
        // DatagramPacket(byte[] buf, int length)
        byte[] bys = new byte[1024];
        int length = bys.length;
        DatagramPacket dp = new DatagramPacket(bys, length);

        // 呼叫Socket物件的接收方法接收資料
        // public void receive(DatagramPacket p)
        ds.receive(dp);

        // 解析資料包,並顯示在控制檯
        // 獲取對方的ip
        // public InetAddress getAddress()
        InetAddress address = dp.getAddress();
        String ip = address.getHostAddress();

        // public byte[] getData():獲取資料緩衝區
        // public int getLength():獲取資料的實際長度
        byte[] bys2 = dp.getData();
        int len = dp.getLength();
        String s = new String(bys2, 0, len);
        System.out.println(ip + ": " + s);

        // 釋放資源
        ds.close();
    }
}

(2) UDP 版本V2.0

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


public class SendDemo {
    public static void main(String[] args) throws IOException {
        //建立傳送端的Socket物件
        DatagramSocket ds = new DatagramSocket();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while ((line = br.readLine()) != null) {
            if ("886".equals(line)) {
                break;
            }
            //建立資料並打包
            byte[] bys = line.getBytes();
            DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.24.1"), 10086);
            //傳送資料
            ds.send(dp);
        }
        //釋放資源
        ds.close();
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        //建立接受端的Socket物件
        DatagramSocket ds = new DatagramSocket(10086);
        while (true) {
            //建立一個包裹
            byte[] bys = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bys, bys.length);

            //接收資料
            ds.receive(dp);

            //解析資料
            String ip = dp.getAddress().getHostAddress();
            String s = new String(dp.getData(), 0, dp.getLength());
            System.out.println(ip + ": " + s);
        }
        // 釋放資源,但是接收端是伺服器應該一直開啟
        //ds.close();
    }
}

(3) UDP 版本V3.0

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendThread implements Runnable {
    private DatagramSocket ds;

    public SendThread(DatagramSocket ds) {
        this.ds = ds;
    }

    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            while ((line = br.readLine()) != null) {
                if ("886".equals(line)) {
                    break;
                }
                // 建立資料並打包
                byte[] bys = line.getBytes();
                DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.24.1"), 10086);
                // 傳送資料
                ds.send(dp);
            }
            // 釋放資源
            ds.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveThread implements Runnable {
    private DatagramSocket ds;

    public ReceiveThread(DatagramSocket ds) {
        this.ds = ds;
    }

    @Override
    public void run() {
        try {
            while (true) {
                //建立一個包裹
                byte[] bys = new byte[1024];
                DatagramPacket dp = new DatagramPacket(bys, bys.length);

                //接收資料
                ds.receive(dp);

                //解析資料
                String ip = dp.getAddress().getHostAddress();
                String s = new String(dp.getData(), 0, dp.getLength());
                System.out.println("from " + ip + " data is : " + s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
import java.net.DatagramSocket;
import java.net.SocketException;

public class ChatRoom {
    public static void main(String[] args) throws SocketException {
        DatagramSocket dsSend = new DatagramSocket();
        DatagramSocket dsReceive = new DatagramSocket(10086);

        SendThread st = new SendThread(dsSend);
        ReceiveThread rt = new ReceiveThread(dsReceive);

        Thread t1 = new Thread(st);
        Thread t2 = new Thread(rt);

        t1.start();
        t2.start();
    }
}

(4) TCP版本

package cn.bwh_06_TCP2;

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

public class Clietn {
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("192.168.24.1", 22222);

        //鍵盤錄入物件
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //把通道內的流包裝一下
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        
        String line = null;
        while ((line = br.readLine()) != null) {
            if ("886".equals(line)) {
                break;
            }
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        s.close();
    }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(22222);
        Socket s = ss.accept();

        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line = null;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

        s.close();
    }
}

(三) 其他功能

(1) 客戶端鍵盤錄入伺服器寫到文字檔案

//封裝通道內的資料
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

//封裝文字檔案
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));

(2) 客戶端讀取文字檔案伺服器控制檯輸出

//封裝文字檔案
BufferedReader br = new BufferedReader(new FileReader("Demo.java"));

//封裝通道內的資料
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

String line = null;
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

結尾:

如果內容中有什麼不足,或者錯誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !^_^

如果能幫到你的話,那就來關注我吧!(系列文章均會在公眾號第一時間更新)

在這裡的我們素不相識,卻都在為了自己的夢而努力 ❤

一個堅持推送原創Java技術的公眾號:理想二旬不止

相關推薦

Java網路程式設計-GG還是MM?

第六階段 網路程式設計 每一臺計算機通過網路連線起來,達到了資料互動的效果,而網路程式設計所解決的問題就是如何讓程式與程式之間實

【帶入門】java網路程式設計

網路程式設計 網路程式設計對於很多的初學者來說,都是很嚮往的一種程式設計技能,但是很多的初學者卻因為很長一段時間無法進入網路程式設計的大門而放棄了對於該部分技術的學習。 在 學習網路程式設計以前,很多初學者可能覺得網路程式設計是比較複雜的系統工程,需要了

這份書單會告訴Java網路程式設計其實很重要

![](https://img2020.cnblogs.com/other/1813797/202005/1813797-20200514074440268-833001464.jpg)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAA

java網路程式設計_IO模型

理解java的BIO、NIO、AIO的原理: 一、UNIX程式設計中的五種IO模型: 1. 阻塞IO 外賣小哥去商家取外賣,到了麻辣燙店,商家還沒做好, 外賣小哥雖然還有其他單子要送,但是不得不焦急地等著商家; 2. 非阻塞IO 外賣小哥去商家取外賣

Java網路程式設計基礎部分

轉載:文章來源 網路通訊協議 網路通訊協議有很多種,目前應用最廣泛的是TCP/IP協議(Transmission Control Protocal/Internet Protoal傳輸控制協議/英特網互聯協議),它是一個包括TCP協議和IP協議,UDP(User Datagram Protoco

20180827-Java網路程式設計

  Java 網路程式設計 網路程式設計是指編寫執行在多個裝置(計算機)的程式,這些裝置都通過網路連線起來。 java.net包中J2SE的API包含有類和介面,它們提供低層次的通訊細節。你可以直接使用這些類和介面,來專注於解決問題,而不用關注通訊細節。 java.net包中提供了兩種常見的

Java網路程式設計的基本網路概念

  前言 自己網路這方面的知識很是薄弱,每次面試被問到這部分都會卡殼,所以很尷尬,然後最近也是有些時間了,就趕緊把自己的不足補充一下。雖然最近也在看設計模式,但是總看設計模式也容易煩,所以就並行學習,看看設計模式,然後再看看這網路程式設計。 網路 首先熟悉一下, 什麼是網路,網路是幾乎可以實

java網路程式設計中常用的類

java網路程式設計中常用的類 1、InetAddress 用於封裝計算機的IP地址和DNS(Domain Name System域名系統)(沒有埠資訊) InetAddress沒有構造器,要得到物件只能通過靜態方法實現 /** * 使用getLocalHost的方法建立InetA

java 網路程式設計——TCP 的三次握手和四次揮手

文章目錄 TCP報頭 三次握手 未連線佇列 四次揮手 狀態詳解 在TCP/IP協議中,TCP協議提供可靠的連線服務,採用三次握手建立一個連線. TCP報頭 埠號:用來標識

深入Java網路程式設計與NIO(二)

Java NIO 與 Netty NIO NIO的特性/NIO與IO區別: 1)IO是面向流的,NIO是面向緩衝區的; 2)IO流是阻塞的,NIO流是不阻塞的; 3)NIO有選擇器,而IO沒有。 讀資料和寫資料方式: 從通道進行資料讀取 :建立一個緩衝區,然後請求通道讀取資料。

Java學習---Java網路程式設計

Java 網路程式設計 網路程式設計是指編寫執行在多個裝置(計算機)的程式,這些裝置都通過網路連線起來。 java.net 包中 J2SE 的 API 包含有類和介面,它們提供低層次的通訊細節。你可以直接使用這些類和介面,來專注於解決問題,而不用關注通訊細節。 java.net

201711671223《Java程式設計》第十二週學習總結13章Java網路程式設計

201711671223《Java程式設計》第十二周學習總結13章Java網路程式設計 URL類(Uniform Resource Locator)是java.net包中的一個重要的類,URL的例項封裝著一個統一資源定位符,使用URL建立物件的應用程式稱作客戶端程式。 一個URL物件通常包含最基

Java - 30 Java 網路程式設計

Java 網路程式設計 網路程式設計是指編寫執行在多個裝置(計算機)的程式,這些裝置都通過網路連線起來。 java.net包中J2SE的API包含有類和介面,它們提供低層次的通訊細節。你可以直接使用這些類和介面,來專注於解決問題,而不用關注通訊細節。 java.net包中提供了兩種常見的網路協議的支援:

java網路程式設計實現登陸

功能描述: 客戶端 輸入使用者名稱密碼,併發送給伺服器,伺服器端接受資訊並進行驗證字後,返回客戶端成功或者失敗。 客戶端程式碼 import java.io.BufferedReader; import java.io.IOException; import jav

java網路程式設計基礎

1.netstat -ano    檢視當前計算機所有協議的通訊狀態,包括協議名,當前計算機地址,其他計算機的地址,狀態:PID 2.netstat -ano | findstr 埠號    檢視對應的埠號是否被佔用,如果沒有佔用,沒有訊息輸出,如果有訊息輸出,代表該埠被佔用

Java網路程式設計,socket實現一對一全雙工通訊聊天功能

本文使用socket的長連線,進行訊息的傳送和接受。 1、兩端 client 端,server端 2、兩執行緒 客戶端、伺服器端,各開兩個執行緒,實現讀寫,可以全雙工通訊,非同步傳送,非同步接受。 3、兩注意 程式等待輸入和一直處於等待訊息發來,所以,用到死迴圈。

java網路程式設計(2)URLDecoder和URLEncoder

一下為程式碼示例,具體的講解穿插在程式碼中 import java.net.URLDecoder; import java.net.URLEncoder; public class URLDecoderTest { public static void mai

java網路程式設計(3)TCP

使用TCP進行網路資料傳輸的時候,TCP會在需要傳輸資料的兩端建立兩個Socket(插座),並且在兩個Socket之間建立一條虛擬鏈路,然後這兩臺主機就可以進行通訊了。 下面是一個很簡單的例子。 Server類建立一個ServerSocket物件,用於監聽客戶端Socke

Java網路程式設計2.UDP網路程式設計

UDP網路程式設計 1、UDP協議傳送資料 (1)UDP協議傳送資料的步驟: UDP協議傳送資料 A: 建立傳送端Socket物件 B: 建立資料,並把資料打包 C: 呼叫Socke

Java網路程式設計4.UDP網路程式設計之多執行緒優化

UDP網路程式設計之多執行緒優化——DatagramSocket類 1、UDP網路程式設計之多執行緒優化的思想 (1)一個執行緒實現客戶端——傳送資料 (2)一個執行緒實現伺服器端——接收資料