av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:93日期:2022-08-11 08:22:19
目錄一、網(wǎng)絡(luò)編程1.1、概述1.2、計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)1.3、網(wǎng)絡(luò)通信要素概述1.4、IP地址和端口號(組合就是網(wǎng)絡(luò)套接字)1.5、網(wǎng)絡(luò)協(xié)議1.6、三次握手與四次揮手二、TCP網(wǎng)絡(luò)編程2.1、Socket介紹2.2、基于Socket的TCP編程2.3、TCP編程簡單C/S通信示例2.4、TCP編程實(shí)現(xiàn)C/S文件傳輸2.5、TCP編程實(shí)現(xiàn)C/S信息反饋三、UDP網(wǎng)絡(luò)編程3.1、UDP網(wǎng)絡(luò)通信3.2、UDP網(wǎng)絡(luò)通信流程3.3、UDP網(wǎng)絡(luò)通信代碼實(shí)現(xiàn)四、URL網(wǎng)絡(luò)編程4.1、URL介紹4.2、URL類與類的構(gòu)造器4.3、URL類常用方法一、網(wǎng)絡(luò)編程1.1、概述

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

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

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

1.2、計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)

1、概念

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

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

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

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

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

①如何準(zhǔn)確地定位網(wǎng)絡(luò)上一臺或多臺主機(jī);定位主機(jī)上的特定的應(yīng)用

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

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

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

IP地址和端口號

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

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

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

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

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

TCP/IP參考模型(或TCP/IP協(xié)議):事實(shí)上的國際標(biāo)準(zhǔn)。

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

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

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

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

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

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

一的標(biāo)識 Internet 上的計(jì)算機(jī)(通信實(shí)體) 本地回環(huán)地址(hostAddress):127.0.0.1 主機(jī)名(hostName):localhost P地址分類方式1:IPV4 和 IPV6 IPV4:4個字節(jié)組成,4個0-255。大概42億,30億都在北美,亞洲4億。2011年初已 經(jīng)用盡。以點(diǎn)分十進(jìn)制表示,如192.168.0.1 IPV6:128位(16個字節(jié)),寫成8個無符號整數(shù),每個整數(shù)用四個十六進(jìn)制位表示, 數(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,專門為組織機(jī) 構(gòu)內(nèi)部使用 特點(diǎn):不易記憶

2、InetAddress類

Internet上的主機(jī)有兩種方式表示地址:

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

②IP 地址(hostAddress):14.215.177.38

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

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

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

/*1 java中使用InetAddress代表IP2 IP的分類:IPV4和IPV6 萬維網(wǎng)和局域網(wǎng)3 域名:www.baidu.com www.cnblogs.com4 本地回路地址:127.0.0.1 對應(yīng)著:localhost5 如何實(shí)例化InetAddress類的對象,兩個靜態(tài)方法: InetAddress getByName(String host) InetAddress getLocalHost()6 兩個常用方法 getHostName() getHostAddress()7 端口號:正在計(jì)算機(jī)上運(yùn)行的進(jìn)程 */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、端口號

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

端口分類:

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

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

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

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

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

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

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

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

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

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

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

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

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)絡(luò)互聯(lián)協(xié)議(IP)而得 名,實(shí)際上是一組協(xié)議,包括多個具有不同功能且互為關(guān)聯(lián)的協(xié)議。

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

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

5、TCP 和 UDP

TCP協(xié)議:

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

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

✔ TCP協(xié)議進(jìn)行通信的兩個應(yīng)用進(jìn)程:客戶端、服務(wù)端。

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

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

UDP協(xié)議:

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

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

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

✔ 可以廣播發(fā)送

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

1.6、三次握手與四次揮手

1、三次握手

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

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

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

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

2、四次揮手

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

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

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

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

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

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

二、TCP網(wǎng)絡(luò)編程2.1、Socket介紹

1、利用套接字(Socket)開發(fā)網(wǎng)絡(luò)應(yīng)用程序早已被廣泛的采用,以至于成為事實(shí) 上的標(biāo)準(zhǔn)。

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

3、通信的兩端都要有Socket,是兩臺機(jī)器間通信的端點(diǎn)。

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

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

6、一般主動發(fā)起通信的應(yīng)用程序?qū)倏蛻舳耍却ㄐ耪埱蟮臑榉?wù)端。

7、Socket分類:

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

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

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

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

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

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

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

// 構(gòu)造器一Socket(String host,int port)throws UnknownHostException,IOException/* 向服務(wù)器(域名是 host。端口號為port)發(fā)起TCP連接,若成功,則創(chuàng)建Socket對象,否則拋出異常。*/// 構(gòu)造器二Socket(InetAddress address,int port)throws IOException/* 根據(jù)InetAddress對象所表示的 IP地址以及端口號port發(fā)起連接。*/

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

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

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

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

5、服務(wù)器建立 ServerSocket 對象

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

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

ServerSocket ss = new ServerSocket(9999); // 1、創(chuàng)建服務(wù)端的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)客戶端與服務(wù)端間的通信 */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();} }} } /* 服務(wù)端 */ @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編程實(shí)現(xiàn)C/S文件傳輸

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

/** * @description: TCP編程,客戶端發(fā)送文件給服務(wù)端,服務(wù)端將文件保存在本地。 */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();} }} }/* 服務(wù)端 */ @Test public void server() throws IOException { // 這里異常應(yīng)該使用try-catch-finallyServerSocket 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編程實(shí)現(xiàn)C/S信息反饋

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

/** * @description: TCP編程,從客戶端發(fā)送文件給服務(wù)端,服務(wù)端保存到本地。并返回“發(fā)送成功”給 客戶端。并關(guān)閉相應(yīng)的連接。 */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(); // 接收服務(wù)端反饋的信息并輸出到控制臺 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();} }} }/* 服務(wù)端 */ @Test public void server() throws IOException { // 這里異常應(yīng)該使用try-catch-finallyServerSocket 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('接收成功');// 服務(wù)端給客戶端反饋信息OutputStream os = clientSocket.getOutputStream();os.write('你好客戶端,照片已經(jīng)收到'.getBytes());socket.close();clientSocket.close();is.close();reader.close();os.close(); }}三、UDP網(wǎng)絡(luò)編程3.1、UDP網(wǎng)絡(luò)通信

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

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

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

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

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

1、DatagramSocket與DatagramPacket

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

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

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

5、關(guān)閉Socket

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

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

/*UDP網(wǎng)絡(luò)編程: ✔ 將數(shù)據(jù)、源、目的封裝成數(shù)據(jù)包,不需要建立連接 ✔ 每個數(shù)據(jù)報的大小限制在64K內(nèi) ✔ 發(fā)送不管對方是否準(zhǔn)備好,接收方收到也不確認(rèn),故是不可靠的 ✔ 可以廣播發(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)絡(luò)編程4.1、URL介紹

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

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

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

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

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

5、Restful風(fēng)格

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

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

1、為了表示URL,java.net 中實(shí)現(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)造器都聲明拋出非運(yùn)行時異常,必須要對這一異常進(jìn)行處理,通 常是用 try-catch 語句進(jìn)行捕。

4.3、URL類常用方法

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

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

以上就是詳解Java網(wǎng)絡(luò)編程的詳細(xì)內(nèi)容,更多關(guān)于Java 網(wǎng)絡(luò)編程的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 大尺度性做爰的小说金陵春 | 综合伊人| 婷婷视频网 | 毛片毛片毛片毛片毛片毛片 | 国产浮力第一页 | 欧美视频久久 | 91成人国产 | 久久av网站 | 大尺度性做爰的小说金陵春 | 亚洲网站在线观看 | 九九国产视频 | 国产伦精品一区二区三区88av | 免费在线观看黄色片 | 一区二区在线看 | 四虎黄色网址 | 国产高清在线视频 | 欧美专区在线 | 玖玖色资源 | 久久久久免费 | 国产网友自拍 | 青青草伊人网 | 日韩成人一区二区 | 日韩1级片| 中文在线播放 | 99精品在线 | 国产日韩在线播放 | 美女91网站 | 宅男噜噜噜66一区二区 | 午夜久久精品 | 日韩精品小视频 | 亚洲在线免费观看 | 欧美顶级黄色大片免费 | 亚洲理论片 | 国产欧美日韩在线 | 亚洲综合在线视频 | 成人毛片在线观看 | 私人午夜影院 | 免费观看av网站 | 国产成人亚洲精品自产在线 | 日韩精品在线一区 | 97国产在线 |