欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java網(wǎng)絡編程

 更新時間:2021年06月10日 16:41:28   作者:laizhenghua  
網(wǎng)絡編程是指編寫運行在多個設(shè)備(計算機)的程序,這些設(shè)備都通過網(wǎng)絡連接起來。本文介紹了一些網(wǎng)絡編程基礎(chǔ)的概念,并用Java來實現(xiàn)TCP和UDP的Socket的編程,來讓讀者更好的了解其原理

一、網(wǎng)絡編程

1.1、概述

1、計算機網(wǎng)絡是通過傳輸介質(zhì)、通信設(shè)施和網(wǎng)絡通信協(xié)議,把分散在不同地點的計算機設(shè)備互連起來,實現(xiàn)資源共享和數(shù)據(jù)傳輸?shù)南到y(tǒng)。網(wǎng)絡編程就就是編寫程序使聯(lián)網(wǎng)的兩個(或多個)設(shè)備(例如計算機)之間進行數(shù)據(jù)傳輸。Java語言對網(wǎng)絡編程提供了良好的支持,通過其提供的接口我們可以很方便地進行網(wǎng)絡編程。

2、Java是 Internet 上的語言,它從語言級上提供了對網(wǎng)絡應用程 序的支持,程序員能夠很容易開發(fā)常見的網(wǎng)絡應用程序。

3、Java提供的網(wǎng)絡類庫,可以實現(xiàn)無痛的網(wǎng)絡連接,聯(lián)網(wǎng)的底層細節(jié)被隱藏在 Java 的本機安裝系統(tǒng)里,由 JVM 進行控制。并 且 Java 實現(xiàn)了一個跨平臺的網(wǎng)絡庫,程序員面對的是一個統(tǒng)一的網(wǎng)絡編程環(huán)境。

1.2、計算機網(wǎng)絡基礎(chǔ)

1、概念

把分布在不同地理區(qū)域的計算機與專門的外部設(shè)備用通信線路互連成一個規(guī)模大、功能強的網(wǎng)絡系統(tǒng),從而使眾多的計算機可以方便地互相傳遞信息、 共享硬件、軟件、數(shù)據(jù)信息等資源。

計算機網(wǎng)絡是計算機專業(yè)必修的一門學科!里面涉及到計算機之間的通信、網(wǎng)絡安全等方方面面,有時間可以自行去學習,關(guān)于更多的網(wǎng)絡基礎(chǔ)知識這里就不一一介紹了。

2、網(wǎng)絡編程的目的

直接或間接地通過網(wǎng)絡協(xié)議與其它計算機實現(xiàn)數(shù)據(jù)交換,進行通訊。

3、網(wǎng)絡編程中有兩個主要的問題

①如何準確地定位網(wǎng)絡上一臺或多臺主機;定位主機上的特定的應用

②找到主機后如何可靠高效地進行數(shù)據(jù)傳輸

1.3、網(wǎng)絡通信要素概述

1、我們需要知道的是主機間通過網(wǎng)絡進行通信是需要遵循網(wǎng)絡通信協(xié)議,是通過IP地址準確定位主機,通過端口號準確定位主機上的應用。

IP地址和端口號

網(wǎng)絡通信協(xié)議

2、如何實現(xiàn)網(wǎng)絡中的主機互相通信?

① 通信雙方地址:IP和端口號

② 一定的規(guī)則(即:網(wǎng)絡通信協(xié)議。有兩套參考模型)

OSI參考模型:模型過于理想化,未能在因特網(wǎng)上進行廣泛推廣。

TCP/IP參考模型(或TCP/IP協(xié)議):事實上的國際標準。

3、網(wǎng)絡通信協(xié)議(以TCP/IP模型為例)

TCP/IP,即Transmission Control Protocol/Internet Protocol的簡寫,中譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,是Internet最基本的協(xié)議、Internet國際互聯(lián)網(wǎng)絡的基礎(chǔ)。

1.4、IP地址和端口號(組合就是網(wǎng)絡套接字)

我們知道IP地址和端口號是通信要素之一,它們可以唯一確定某一臺主機的某個應用,并為主機之間通信提供了可能!那么什么是IP地址和端口號呢?

1、IP 地址:InetAddress(在Java中使用InetAddress類代表IP)

  • 一的標識 Internet 上的計算機(通信實體)
  • 本地回環(huán)地址(hostAddress):127.0.0.1 主機名(hostName):localhost
  • P地址分類方式1:IPV4 和 IPV6
  • IPV4:4個字節(jié)組成,4個0-255。大概42億,30億都在北美,亞洲4億。2011年初已 經(jīng)用盡。以點分十進制表示,如192.168.0.1
  • IPV6:128位(16個字節(jié)),寫成8個無符號整數(shù),每個整數(shù)用四個十六進制位表示, 數(shù)之間用冒號(:)分開,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984
  • IP地址分類方式2:公網(wǎng)地址(萬維網(wǎng)使用)和私有地址(局域網(wǎng)使用)。192.168. 開頭的就是私有址址,范圍即為192.168.0.0–192.168.255.255,專門為組織機 構(gòu)內(nèi)部使用
  • 特點:不易記憶

2、InetAddress類

Internet上的主機有兩種方式表示地址:

①域名(hostName):www.baidu.com

②IP 地址(hostAddress):14.215.177.38

InetAddress類主要表示IP地址,兩個子類:Inet4Address、Inet6Address

InetAddress 類對象含有一個 Internet 主機地址的域名和IP地址:www.baidu.com 和 14.215.177.38

域名容易記憶,當在連接網(wǎng)絡時輸入一個主機的域名后,域名服務器(DNS) 負責將域名轉(zhuǎn)化成IP地址,這樣才能和主機建立連接。 -------域名解析

/*
1 java中使用InetAddress代表IP
2 IP的分類:IPV4和IPV6     萬維網(wǎng)和局域網(wǎng)

3 域名:www.baidu.com www.cnblogs.com

4 本地回路地址:127.0.0.1 對應著:localhost

5 如何實例化InetAddress類的對象,兩個靜態(tài)方法:
    InetAddress getByName(String host)
    InetAddress getLocalHost()

6 兩個常用方法
    getHostName()
    getHostAddress()

7 端口號:正在計算機上運行的進程
 */
public class InetAddressTest {
    public static void main(String[] args){
        try {
            // File file = new File("test.txt");
            InetAddress IP1 = InetAddress.getByName("192.168.3.2");
            System.out.println(IP1);

            InetAddress IP2 = InetAddress.getByName("www.baidu.com");
            System.out.println(IP2);
            // 獲取本地IP
            InetAddress localHost = InetAddress.getLocalHost();
            System.out.println(localHost);

            // getHostName()
            System.out.println(IP2.getHostName());
            // getHostAddress()
            System.out.println(IP2.getHostAddress());


        } catch(UnknownHostException e){
            e.printStackTrace();
        }
    }
}

3、端口號

  • 端口號就是標識正在計算機上運行的進程(程序)
  • 不同的進程有不同的端口號
  • 被規(guī)定為一個 16 位的整數(shù) 0~65535。

端口分類:

① 公認端口:0~1023。被預先定義的服務通信占用(如:HTTP占用端口 80,F(xiàn)TP占用端口21,Telnet占用端口23)

② 注冊端口:1024~49151。分配給用戶進程或應用程序。(如:Tomcat占 用端口8080,MySQL占用端口3306,Oracle占用端口1521等)。

③ 動態(tài)/私有端口:49152~65535

4、端口號與IP地址的組合得出一個網(wǎng)絡套接字:Socket

1.5、網(wǎng)絡協(xié)議

1、網(wǎng)絡通信協(xié)議

計算機網(wǎng)絡中實現(xiàn)通信必須有一些約定,即通信協(xié)議,對速率、傳輸代碼、代 碼結(jié)構(gòu)、傳輸控制步驟、出錯控制等制定標準。

2、問題:網(wǎng)絡協(xié)議太復雜

計算機網(wǎng)絡通信涉及內(nèi)容很多,比如指定源地址和目標地址,加密解密,壓縮 解壓縮,差錯控制,流量控制,路由控制,如何實現(xiàn)如此復雜的網(wǎng)絡協(xié)議呢?

3、通信協(xié)議分層的思想

在制定協(xié)議時,把復雜成份分解成一些簡單的成份,再將它們復合起來。最常 用的復合方式是層次方式,即同層間可以通信、上一層可以調(diào)用下一層,而與 再下一層不發(fā)生關(guān)系。各層互不影響,利于系統(tǒng)的開發(fā)和擴展。

4、TCP/IP協(xié)議簇

傳輸層協(xié)議中有兩個非常重要的協(xié)議:

  • 傳輸控制協(xié)議TCP(Transmission Control Protocol)
  • 戶數(shù)據(jù)報協(xié)議UDP(User Datagram Protocol)

TCP/IP 以其兩個主要協(xié)議:傳輸控制協(xié)議(TCP)和網(wǎng)絡互聯(lián)協(xié)議(IP)而得 名,實際上是一組協(xié)議,包括多個具有不同功能且互為關(guān)聯(lián)的協(xié)議。

IP(Internet Protocol)協(xié)議是網(wǎng)絡層的主要協(xié)議,支持網(wǎng)間互連的數(shù)據(jù)通信。

TCP/IP協(xié)議模型從更實用的角度出發(fā),形成了高效的四層體系結(jié)構(gòu),即物理鏈路層、IP層、傳輸層和應用層。

5、TCP 和 UDP

TCP協(xié)議:

✔ 使用TCP協(xié)議前,須先建立TCP連接,形成傳輸數(shù)據(jù)通道

✔ 傳輸前,采用“三次握手”方式,點對點通信,是可靠的

✔ TCP協(xié)議進行通信的兩個應用進程:客戶端、服務端。

✔ 在連接中可進行大數(shù)據(jù)量的傳輸

✔ 傳輸完畢,需釋放已建立的連接,效率低

UDP協(xié)議:

✔ 將數(shù)據(jù)、源、目的封裝成數(shù)據(jù)包,不需要建立連接

✔ 每個數(shù)據(jù)報的大小限制在64K內(nèi)

✔ 發(fā)送不管對方是否準備好,接收方收到也不確認,故是不可靠的

✔ 可以廣播發(fā)送

✔ 發(fā)送數(shù)據(jù)結(jié)束時無需釋放資源,開銷小,速度快

1.6、三次握手與四次揮手

1、三次握手

第一步,請求端(客戶端)發(fā)送一個包含SYN標志的TCP報文,SYN即同步(Synchronize),同步報文會指明客戶端使用的端口以及TCP連接的初始序號;

第二步,服務器在收到客戶端的SYN報文后,將返回一個SYN+ACK的報文,表示客戶端的請求被接受,同時TCP序號被加一,ACK即確認(Acknowledgment)。

第三步,客戶端也返回一個確認報文ACK給服務器端,同樣TCP序列號被加一,到此一個TCP連接完成。

2、四次揮手

由于TCP連接是全雙工的,因此每個方向都必須單獨進行關(guān)閉。這原則是當一方完成它的數(shù)據(jù)發(fā)送任務后就能發(fā)送一個FIN來終止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數(shù)據(jù)流動,一個TCP連接在收到一個FIN后仍能發(fā)送數(shù)據(jù)。首先進行關(guān)閉的一方將執(zhí)行主動關(guān)閉,而另一方執(zhí)行被動關(guān)閉。

1.TCP客戶端發(fā)送一個FIN,用來關(guān)閉客戶到服務器的數(shù)據(jù)傳送。

2.服務器收到這個FIN,它發(fā)回一個ACK,確認序號為收到的序號加1。和SYN一樣,一個FIN將占用一個序號。

3.服務器關(guān)閉客戶端的連接,發(fā)送一個FIN給客戶端。

4.客戶端發(fā)回ACK報文確認,并將確認序號設(shè)置為收到序號加1。

二、TCP網(wǎng)絡編程

2.1、Socket介紹

1、利用套接字(Socket)開發(fā)網(wǎng)絡應用程序早已被廣泛的采用,以至于成為事實 上的標準。

2、網(wǎng)絡上具有唯一標識的IP地址和端口號組合在一起才能構(gòu)成唯一能識別的標識符套接字。

3、通信的兩端都要有Socket,是兩臺機器間通信的端點。

4、網(wǎng)絡通信其實就是Socket間的通信。

5、Socket允許程序把網(wǎng)絡連接當成一個流,數(shù)據(jù)在兩個Socket間通過IO傳輸。

6、一般主動發(fā)起通信的應用程序?qū)倏蛻舳?,等待通信請求的為服務端?/p>

7、Socket分類:

  • 流套接字(stream socket):使用TCP提供可依賴的字節(jié)流服務
  • 數(shù)據(jù)報套接字(datagram socket):使用UDP提供“盡力而為”的數(shù)據(jù)報服務

2.2、基于Socket的TCP編程

1、Java語言的基于套接字編程分為服務端編程和客戶端編程,其通信模型如圖所示

2、客戶端Socket的工作過程包含以下四個基本的步驟:

  • 創(chuàng)建 Socket:根據(jù)指定服務端的 IP 地址或端口號構(gòu)造 Socket 類對象。若服務器端響應,則建立客戶端到服務端的通信路線。若連接失敗,則會出現(xiàn)異常。
  • 打開連接到 Socket 的輸入/出流: 使用 getInputStream()方法獲得輸入流,使用 getOutputStream()方法獲得輸出流,進行數(shù)據(jù)傳輸
  • 按照一定的協(xié)議對 Socket 進行讀/寫操作:通過輸入流讀取服務器放入線路的信息(但不能讀取自己放入路線的信息),通過輸出流將信息寫入線程
  • 關(guān)閉 Socket:斷開客戶端到服務器的連接,釋放線路

3、客戶端創(chuàng)建Socket對象:

客戶端程序可以使用Socket類創(chuàng)建對象,創(chuàng)建的同時會自動向服務器方發(fā)起連 接。Socket的構(gòu)造器是:

// 構(gòu)造器一
Socket(String host,int port)throws UnknownHostException,IOException
/* 向服務器(域名是 host。端口號為port)發(fā)起TCP連接,若成功,則創(chuàng)建Socket對象,否則拋出異常。*/

// 構(gòu)造器二
Socket(InetAddress address,int port)throws IOException
/* 根據(jù)InetAddress對象所表示的 IP地址以及端口號port發(fā)起連接。*/

客戶端建立socketAtClient對象的過程就是向服務器發(fā)出套接字連接請,簡要步驟如下

Socket s = new Socket("192.168.40.165",9999); // 1、創(chuàng)建Socket對象,指明服務端的IP和端口號
OutputStream out = s.getOutputStream(); // 2、獲取一個輸出流,用于輸出數(shù)據(jù)
out.write("hello".getBytes()); // 3、寫出數(shù)據(jù)
s.close(); // 4、回收資源

4、服務器(服務端)程序的工作過程包含以下四個基本的步驟:

  • 調(diào)用 ServerSocket(int port) :創(chuàng)建一個服務器端套接字,并綁定到指定端口 上。用于監(jiān)聽客戶端的請求。
  • 調(diào)用 accept():監(jiān)聽連接請求,如果客戶端請求連接,則接受連接,返回通信 套接字對象。
  • 調(diào)用 該Socket類對象的 getOutputStream() 和 getInputStream ():獲取輸出 流和輸入流,開始網(wǎng)絡數(shù)據(jù)的發(fā)送和接收。
  • 關(guān)閉ServerSocket和Socket對象:客戶端訪問結(jié)束,關(guān)閉通信套接字。

5、服務器建立 ServerSocket 對象

ServerSocket 對象負責等待客戶端請求建立套接字連接,類似郵局某個窗口 中的業(yè)務員。也就是說,服務器必須事先建立一個等待客戶請求建立套接字 連接的ServerSocket對象。

所謂“接收”客戶的套接字請求,就是accept()方法會返回一個 Socket 對象

ServerSocket ss = new ServerSocket(9999); // 1、創(chuàng)建服務端的ServerSocket,指明自己的端口號
Socket s = ss.accept (); // 2、調(diào)用accept()監(jiān)聽來自客戶端的連接
InputStream in = s.getInputStream(); // 3、獲取輸入流,讀取輸入流的數(shù)據(jù)
byte[] buf = new byte[1024]; 
int num = in.read(buf); 
String str = new String(buf,0,num); 
System.out.println(s.getInetAddress().toString()+":"+str); 
s.close(); // 4、回收資源
ss.close();

2.3、TCP編程簡單C/S通信示例

/**
 * @description: TCP編程,模擬基于C/S架構(gòu)客戶端與服務端間的通信
 */
public class SocketTest {
    /* 客戶端 */
    @Test
    public void client(){
        OutputStream output = null;
        Socket socket = null;
        try {
            InetAddress localHost = InetAddress.getByName("127.0.0.1");
            socket = new Socket(localHost,8848);
            output = socket.getOutputStream();
            output.write("hello I'm the client".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(output != null){
                try {
                    output.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /* 服務端 */
    @Test
    public void server() {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream input = null;
        ByteArrayOutputStream out = null;
        try {
            serverSocket = new ServerSocket(8848);
            socket = serverSocket.accept();
            System.out.println("client IP: " + socket.getInetAddress());
            input = socket.getInputStream();
            /*
            一般不建議這樣書寫,數(shù)據(jù)傳輸時可能會出現(xiàn)亂碼??!
            byte[] buffer = new byte[1024];
            int len;
            while((len = input.read(buffer)) != -1){
                String data = new String(buffer,0,len);
                System.out.println(data);
            }*/

            out = new ByteArrayOutputStream();
            byte[] buffer = new byte[10];
            int len;
            while((len = input.read(buffer)) != -1){
                out.write(buffer,0,len);
            }
            System.out.println(out.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(out != null){
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(input != null){
                try {
                    input.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();
                }
            }
        }
    }
}

2.4、TCP編程實現(xiàn)C/S文件傳輸

實現(xiàn)功能:客戶端發(fā)送文件給服務端,服務端將文件保存在本地。

/**
 * @description: TCP編程,客戶端發(fā)送文件給服務端,服務端將文件保存在本地。
 */
public class TCPSocketTest {
	/* 客戶端 */
    @Test
    public void client() {
        Socket socket = null;
        OutputStream writer = null;
        BufferedInputStream bis = null;
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"),8089);
            writer = socket.getOutputStream();

            bis = new BufferedInputStream(new FileInputStream(new File("me.jpg")));
            byte[] buffer = new byte[1024];
            int len;
            while((len = bis.read(buffer)) != -1){
                writer.write(buffer,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(writer != null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bis != null){
                try {
                    bis.close();
                    System.out.println("發(fā)送成功!");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
	/* 服務端 */
    @Test
    public void server() throws IOException { // 這里異常應該使用try-catch-finally
        ServerSocket socket = new ServerSocket(8089);
        System.out.println("正在等待客戶端連接...");
        Socket clientSocket = socket.accept();

        System.out.println("客戶端已連接IP地址為:"+clientSocket.getInetAddress().getHostName());
        InputStream is = clientSocket.getInputStream();
        BufferedOutputStream reader = new BufferedOutputStream(new FileOutputStream(new File("new_me.jpg")));

        byte[] buffer = new byte[1024];
        int len;
        while((len = is.read(buffer)) != -1){
            reader.write(buffer,0,len);
        }
        System.out.println("接收成功");

        socket.close();
        clientSocket.close();
        is.close();
        reader.close();
    }
}

2.5、TCP編程實現(xiàn)C/S信息反饋

實現(xiàn)功能:從客戶端發(fā)送文件給服務端,服務端保存到本地。并返回“發(fā)送成功”給 客戶端。并關(guān)閉相應的連接。

/**
 * @description: TCP編程,從客戶端發(fā)送文件給服務端,服務端保存到本地。并返回“發(fā)送成功”給 客戶端。并關(guān)閉相應的連接。
 */
public class TCPSocketTest2 {
	/* 客戶端 */
    @Test
    public void client() {
        Socket socket = null;
        OutputStream writer = null;
        BufferedInputStream bis = null;
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"),8089);
            writer = socket.getOutputStream();

            bis = new BufferedInputStream(new FileInputStream(new File("me.jpg")));
            byte[] buffer = new byte[1024];
            int len;
            while((len = bis.read(buffer)) != -1){
                writer.write(buffer,0,len);
            }
            // 關(guān)閉數(shù)據(jù)的輸出
            socket.shutdownOutput();

            // 接收服務端反饋的信息并輸出到控制臺
            InputStream is = socket.getInputStream();
            ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
            byte[] buf = new byte[10];
            int l;
            while((l = is.read(buf)) != -1){
                byteArray.write(buf,0,l);
            }
            System.out.println(byteArray.toString());
            is.close();
            byteArray.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(writer != null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bis != null){
                try {
                    bis.close();
                    System.out.println("發(fā)送成功!");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
	/* 服務端 */
    @Test
    public void server() throws IOException { // 這里異常應該使用try-catch-finally
        ServerSocket socket = new ServerSocket(8089);
        System.out.println("正在等待客戶端連接...");
        Socket clientSocket = socket.accept();

        System.out.println("客戶端已連接IP地址為:"+clientSocket.getInetAddress().getHostName());
        InputStream is = clientSocket.getInputStream();
        BufferedOutputStream reader = new BufferedOutputStream(new FileOutputStream(new File("new_me.jpg")));

        byte[] buffer = new byte[1024];
        int len;
        while((len = is.read(buffer)) != -1){
            reader.write(buffer,0,len);
        }
        System.out.println("接收成功");

        // 服務端給客戶端反饋信息
        OutputStream os = clientSocket.getOutputStream();
        os.write("你好客戶端,照片已經(jīng)收到".getBytes());

        socket.close();
        clientSocket.close();
        is.close();
        reader.close();
        os.close();
    }
}

三、UDP網(wǎng)絡編程

3.1、UDP網(wǎng)絡通信

1、類 DatagramSocket 和 DatagramPacket 實現(xiàn)了基于 UDP 協(xié)議網(wǎng)絡程序。

2、UDP數(shù)據(jù)報通過數(shù)據(jù)報套接字 DatagramSocket 發(fā)送和接收,系統(tǒng)不保證 UDP數(shù)據(jù)報一定能夠安全送到目的地,也不能確定什么時候可以抵達。

3、DatagramPacket 對象封裝了UDP數(shù)據(jù)報,在數(shù)據(jù)報中包含了發(fā)送端的IP地址和端口號以及接收端的IP地址和端口號。

4、UDP協(xié)議中每個數(shù)據(jù)報都給出了完整的地址信息,因此無須建立發(fā)送方和接收方的連接。如同發(fā)快遞包裹一樣。

3.2、UDP網(wǎng)絡通信流程

1、DatagramSocket與DatagramPacket

2、建立發(fā)送端,接收端

3、建立數(shù)據(jù)包

4、調(diào)用Socket的發(fā)送、接收方法

5、關(guān)閉Socket

注意:發(fā)送端與接收端是兩個獨立的運行程序

3.3、UDP網(wǎng)絡通信代碼實現(xiàn)

/*
UDP網(wǎng)絡編程:
    ✔ 將數(shù)據(jù)、源、目的封裝成數(shù)據(jù)包,不需要建立連接
    ✔ 每個數(shù)據(jù)報的大小限制在64K內(nèi)
    ✔ 發(fā)送不管對方是否準備好,接收方收到也不確認,故是不可靠的
    ✔ 可以廣播發(fā)送
    ✔ 發(fā)送數(shù)據(jù)結(jié)束時無需釋放資源,開銷小,速度快
 */
public class UDPSocketTest {
    @Test // 發(fā)送端
    public void send() throws IOException {
        DatagramSocket socket = new DatagramSocket();

        byte[] data = "hello world".getBytes();
        DatagramPacket packet = new DatagramPacket(data,0,data.length, InetAddress.getLocalHost(),8080);

        socket.send(packet);

        socket.close();
    }

    @Test // 接收端
    public void receiver() throws IOException {
        DatagramSocket socket = new DatagramSocket(8080);

        byte[] buffer = new byte[100];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);

        socket.receive(packet);

        System.out.println(new String(packet.getData(),0,packet.getLength()));

        socket.close();
    }
}

四、URL網(wǎng)絡編程

4.1、URL介紹

1、URL(Uniform Resource Locator):統(tǒng)一資源定位符,它表示 Internet 上某一 資源的地址。

2、它是一種具體的URI,即URL可以用來標識一個資源,而且還指明了如何locate 這個資源。

3、通過 URL 我們可以訪問 Internet 上的各種網(wǎng)絡資源,比如最常見的 www,ftp 站點。瀏覽器通過解析給定的 URL 可以在網(wǎng)絡上查找相應的文件或其他資源。

4、URL的基本結(jié)構(gòu)由5部分組成: <傳輸協(xié)議>://<主機名>:<端口號>/<文件名>#片段名?參數(shù)列表

  • 例如: http://192.168.1.100:8080/helloworld/index.jsp#a?username=shkstart&password=123
  • #片段名:即錨點,例如看小說,直接定位到章節(jié)
  • 參數(shù)列表格式:參數(shù)名=參數(shù)值&參數(shù)名=參數(shù)值…

5、Restful風格

一種軟件架構(gòu)風格、設(shè)計風格,而不是標準,只是提供了一組設(shè)計原則和約束條件。它主要用于客戶端和服務器交互類的軟件?;谶@個風格設(shè)計的軟件可以更簡潔,更有層次,更易于實現(xiàn)緩存等機制。restful風格在實際開發(fā)中使用較多,對于URL地址有全新的使用方式,可以自行了解restful風格的使用!

4.2、URL類與類的構(gòu)造器

1、為了表示URL,java.net 中實現(xiàn)了類 URL。我們可以通過下面的構(gòu)造器來初 始化一個 URL 對象:

  • public URL (String spec):通過一個表示URL地址的字符串可以構(gòu)造一個URL對象。例如:URL url = new URL ("https://www.baidu.com/");
  • public URL(URL context, String spec):通過基 URL 和相對 URL 構(gòu)造一個 URL 對象。 例如:URL downloadUrl = new URL(url, “download.html");
  • public URL(String protocol, String host, String file); 例如:new URL(“http”, “www.atguigu.com”, “download. html");
  • public URL(String protocol, String host, int port, String file); 例如: URL gamelan = new URL(“http”, “www.atguigu.com”, 80, “download.html");

2、URL類的構(gòu)造器都聲明拋出非運行時異常,必須要對這一異常進行處理,通 常是用 try-catch 語句進行捕。

4.3、URL類常用方法

一個URL對象生成后,其屬性是不能被改變的,但可以通過它給定的方法來獲取這些屬性:

  • public String getProtocol( ) 獲取該URL的協(xié)議名
  • public String getHost( ) 獲取該URL的主機名
  • public String getPort( ) 獲取該URL的端口號
  • public String getPath( ) 獲取該URL的文件路徑
  • public String getFile( ) 獲取該URL的文件名
  • public String getQuery( ) 獲取該URL的查詢名

以上就是詳解Java網(wǎng)絡編程的詳細內(nèi)容,更多關(guān)于Java 網(wǎng)絡編程的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論