5-1 Java 網絡編程

第1關:URL類與InetAddress類
任務描述

本關任務:了解網絡編程基礎知識。

相關知識

為了完成本關任務,你需要掌握:1.URL;2.InetAddress。

URL

統一資源定位符(Uniform Resource Locator,縮寫為URL)是對可以從互聯網上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯網上標準資源的地址。 互聯網上的每個文件都有一個唯一的URL,它包含的信息指出文件的位置以及瀏覽器應該怎么處理它。

URL可以分為如下幾個部分:

protocol://host:port/path?query#fragment

HTTP 協議的 URL 實例如下:

http://www.runoob.com/index.html?language=cn#javase
  • 協議為(protocol):http
  • 主機為(host:port):www.runoob.com
  • 端口號為(port): 80 ,以上URL實例并未指定端口,因為 HTTP 協議默認的端口號為 80
  • 文件路徑為(path):/index.html
  • 請求參數(query):language=cn
  • 定位位置(fragment):javase,定位到網頁中 id 屬性為 javaseHTML 元素位置。
URL對象

java.net 包中的 URL 類是對統一資源定位符的抽象,使用 URL 創建對象的應用程序稱作客戶端程序。一個URL 對象通常包含最基本的三部分信息:協議、地址和資源。

  1. URL對象定義 public URL(String spec) throws MalformedURLException public URL(String protocol, String host, String file) throws MalformedURLException
  2. 讀取 URL 中的資源: URL 對象調用 InputStream openStream()方法返回一個輸入流,該輸入流指向 URL 對象所包含的資源。通過該輸入流可以將服務器上的資源信息讀入到客戶端。
InetAddress 類

InetAddress類是Java對IP地址的封裝,在java.net中有許多類都使用到了InetAddress類,包括:ServerSocketSocketDatagramSocket等等。 InetAddress對域名進行解析是使用本地機器配置或者網絡命名服務(如域名系統(Domain Name System,DNS)和網絡信息服務(Network Information Service,NIS))來實現。對于DNS來說,本地需要向DNS服務器發送查詢的請求,然后服務器根據一系列的操作,返回對應的IP地址。 為了提高效率,通常本地會緩存一些主機名與IP地址的映射,這樣訪問相同的地址,就不需要重復發送DNS請求了。在java.net.InetAddress類同樣采用了這種策略。默認情況下,會緩存一段有限時間的映射,對于主機名解析不成功的結果,會緩存非常短的時間(10秒)來提高性能。

該類沒有構造器,可以通過它的兩個靜態方法來獲取InetAddress的實例。

  1. getByName(String s):獲取InetAddress對象
  • 域名作為getByName()getAllByName()方法的參數得到的InetAddress對象,該對象會得到這個域名,當調用 getHostName()時,就無需再訪問DNS服務器,而是直接將這個域名返回。
  • IP地址作為getByName()getAllByName()getByAddress()方法的參數,創建InetAddress對象時,并不需要訪問DNS服務器。因此,通過DNS服務器查找域名的工作就由getHostName()方法來完成。如果IP地址不存在或DNS服務器不允許進行IP地址和域名映射,就返回這個IP地址。
  • 主機名作為參數創建InetAddress對象。
  • 靜態方法getLocalHost()獲取本機的InetAddress。如果獲取不到(可能是安全問題),就會返回地址:127.0.0.1 和 主機名:localhost
  1. getByAddress(byte[] addr):根據源IP地址來獲取InetAddress對象。
編程要求

根據提示,使用URL類和InetAddress類編程,在右側編輯器 Begin-End 補充代碼。

  1. 使用java.netURL類獲取URL的各個部分參數
  2. 使用InetAddress類的getAllByName()方法,輸出百度主機的所有地址
測試說明

平臺會對你編寫的代碼進行測試:

測試輸入:

預期輸出:

協議為:http

主機名:www.runoob.com

路徑:/index.html

端口:-1

請求參數:language=cn

www.baidu.com/180.101.50.188

www.baidu.com/180.101.49.242

注明:百度主機輸出結果的順序不一致時,可以多評測幾次。

代碼實現

package step1;import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;public class Step1Test
{public static void main(String[] args){// URL地址:http://www.runoob.com/index.html?language=cn#javase// 1. 要求輸出:協議、主機名、路徑、端口、請求參數// ********** Begin **********try{URL url = new URL("http://www.runoob.com/index.html?language=cn#javase");System.out.println("協議為:" + url.getProtocol());System.out.println("主機名:" + url.getHost());System.out.println("路徑:" + url.getPath());System.out.println("端口:" + url.getPort());System.out.println("請求參數:" + url.getQuery());}catch (MalformedURLException e){e.printStackTrace();}// 2. 輸出百度的所有主機地址// ********** End **********try{InetAddress[] addresses = InetAddress.getAllByName("www.baidu.com");// for (InetAddress address : addresses)// {//     System.out.println("www.baidu.com/" + address.getHostAddress());// }System.out.println("www.baidu.com/" + addresses[0].getHostAddress());System.out.println("www.baidu.com/" + addresses[1].getHostAddress());}catch (UnknownHostException e){e.printStackTrace();}}
}
第2關:TCP Socket通信
任務描述

本關任務:編寫程序實現基于TCP/IP協議的Socket通信。

相關知識

為了完成本關任務,你需要掌握:1.TCP/IP協議,2.Socket套接字,3.基于TCP/IP協議的Socket通信。

OSI參考模型和TCP/IP模型

計算機網絡市場剛剛興起時,許多計算機生產廠商都積極推出自己公司獨創的網絡。由于這些網絡都不互通,導致使用某種網絡的用戶如果在后續擴展網絡時必須繼續使用原計算機廠商的設備。這樣使得市場上各自保護現象很嚴重。基于上述原因,國際標準化組織制定了一套標準,只要大家都遵循這套標準,那么各自的產品就可以相互兼容,這套標準就叫OSI參考模型。正所謂“沒有規矩不成方圓”。 OSI參考模型分為7層,分別是物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。分層有助于把網絡操作分成不太復雜的單元,分工合作,責任明確。

TCP/IP模型嚴格來說是一個四層的體系結構。應用層、傳輸層、網絡層和數據鏈路層都包含其中。雖然它有四層網絡模型層數,只是因為在TCP/IP模型中TCP模型和IP模型最具代表性,所以被稱為TCP/IP模型。TCP/IP模型具有數據的時新性、具有數據的時新性和傳輸技術的先進易用性。

在這里插入圖片描述

TCP/IP協議

從字面意義上講,有人可能會認為 TCP/IP 是指 TCP 和 IP 兩種協議。實際生活當中有時也確實就是指這兩種協議。然而在很多情況下,它只是利用 IP 進行通信時所必須用到的協議群的統稱。具體來說,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都屬于 TCP/IP 協議。它們與 TCP 或 IP 的關系緊密,是互聯網必不可少的組成部分。
在這里插入圖片描述

Socket套接字

我們可以把所有渴望建立連接的對象都理解為套接字。要想建立網絡連接,就像插頭與插座套接在一起,而“字”則代表了可交互的有序指令串。Socket的引入就是為了解決不同計算機之間進程間相互通信的問題。
在這里插入圖片描述

IP層的IP地址可以唯一標識Internet上的計算機,而TCP層協議和端口號可以唯一標識計算機上運行的一個進程,這樣我們可以利用“IP地址+協議+端口號”來唯一標識網絡中的一個進程。IP地址與端口號的組合可以得出一個Socket即網絡套接字。Socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作,抽象為幾個簡單的接口供應用層調用,以實現進程在網絡中的通信。能夠唯一標識網絡中的進程后,就可以利用Socket進行通信了。

Socket通信模型

具體地,Socket通信的過程,它通常分為三個步驟,分別是:服務器監聽,客戶端請求,連接確認。在 Java 語言中,需要使用 java.net 包中的ServerSocket類和Socket類來實現。

在這里插入圖片描述

編程要求

請編寫程序實現基于TCP/IP協議的Socket通信過程。 服務器端程序平臺已經編寫完畢。需要你根據提示,在右側編輯器補充客戶端代碼。

  • 服務器端開放: IP地址:127.0.0.1 端口號:8889
  • 客戶端發送數據: Hello Server!
測試說明

服務器端代碼:

public class Server 
{public static void main(String[] args) {try {ServerSocket ss = new ServerSocket(8889);System.out.println("啟動服務器....");Socket s = ss.accept();BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));//讀取客戶端發送來的消息String mess = br.readLine();System.out.println("客戶端:" + mess);ss.close();} catch (IOException e) {e.printStackTrace();}}
}

平臺會對你編寫的代碼進行測試:

測試輸入:

啟動服務器…

客戶端:測試客戶端與服務器通信:Hello Server!

開始你的任務吧,祝你成功!

代碼實現

package step2;import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;/*** 描述:描述:第2關:TCP Socket通信** @author 為一道彩虹*/
public class Client 
{public static void main(String[] args){try {// 連接到IP地址為127.0.0.1,端口號為8889的服務器Socket socket = new Socket("127.0.0.1", 8889);// 獲取socket的輸出流OutputStream outputStream = socket.getOutputStream();// 使用PrintWriter包裝輸出流,方便發送字符串PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"), true);// 發送數據到服務器writer.println("測試客戶端與服務器通信:Hello Server!");// 關閉連接socket.close();}catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
第3關:UDP Socket通信
任務描述

本關任務:編寫程序實現基于UDP協議的Socket通信。

相關知識

為了完成本關任務,你需要掌握:1.UDP協議,2.Socket套接字,3.基于UDP協議的Socket通信。

UDP協議

基于UDP的通信和基于TCP的通信不同,基于UDP的信息傳遞更快,但不提供可靠性保證。即數據在傳輸時,用戶無法知道數據能否正確到達目的地主機,也不能確定數據到達目的地的順序是否和發送的順序相同。UDP通信比作郵遞信件。

基于UDP通信的基本模式:

  • 將數據打包,稱為數據包,然后將數據包發往目的地。
  • 接收別人發來的數據包,然后查看數據包中的內容。
Socket套接字

我們可以把所有渴望建立連接的對象都理解為套接字。要想建立網絡連接,就像插頭與插座套接在一起,而“字”則代表了可交互的有序指令串。Socket的引入就是為了解決不同計算機之間進程間相互通信的問題。
在這里插入圖片描述

IP層的IP地址可以唯一標識Internet上的計算機,而TCP層協議和端口號可以唯一標識計算機上運行的一個進程,這樣我們可以利用“IP地址+協議+端口號”來唯一標識網絡中的一個進程。IP地址與端口號的組合可以得出一個Socket即網絡套接字。Socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作,抽象為幾個簡單的接口供應用層調用,以實現進程在網絡中的通信。能夠唯一標識網絡中的進程后,就可以利用Socket進行通信了。

UDP Socket通信模型
  1. DatagramPacket 類將數據打包,有兩個構造方法:
  • public DatagramPacket(byte[] data, int length, InetAddress address, int port);
  • public DatagramPacket(byte[] data, int offset, int length, InetAddress address, int port);
  1. DatagramSocket 類的不帶參數的構造方法 DatagramSocket()創建一個對象,該對象負責發送數據包。
DatagramSocket mail_out = new DatagramSocket(); 
Mail_out.send(data_pack);
  1. DatagramSocket 類的另一個構造方法 DatagramSocket(int port)創建一個對象,其中的參數必須和待接收數據包的發送端口號相同。
DatagramSocket mail_in = new DatagramSocket(5666); 
  1. 然后對象 mail_in 使用方法 receive(DatagramPacket pack) 接收數據包。必須預備一個數據包以便接收數據包。這時需要使用DatagramPacket 類的另外一個構造方法 DatagramPacket(byte[] data, int length) 創建一個數據包。
byte[] data = new byte[100];
int length = 90;
DatagramPacket pack = new DatagramPacket(data, length);
mail_in.receive(pack);
編程要求

請編寫程序實現基于UDP協議的Socket通信過程。 客戶端程序平臺已經編寫完畢。需要你根據提示,在右側編輯器補充服務器端代碼。 服務器端開放:

IP地址:127.0.0.1或者localhost

端口號:12345

用于接收從客戶端發送過來的數據:

用戶名:admin;密碼:123

測試說明

客戶端代碼:

public class UDPClient 
{public static void main(String[] args) throws IOException {/** 向服務器端發送數據*/// 1.定義服務器的地址、端口號、數據InetAddress address = InetAddress.getByName("localhost");int port = 12345;byte[] data = "用戶名:admin;密碼:123".getBytes();// 2.創建數據報,包含發送的數據信息DatagramPacket packet = new DatagramPacket(data, data.length, address, port);// 3.創建DatagramSocket對象DatagramSocket socket = new DatagramSocket();// 4.向服務器端發送數據報socket.send(packet);// 5.關閉資源socket.close();}
}

平臺會對你編寫的代碼進行測試:

測試輸入:

預期輸出:

****服務器端已經啟動,等待客戶端發送數據

我是服務器,客戶端說:用戶名:admin;密碼:123

開始你的任務吧,祝你成功!

代碼實現

 package step3;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDPServer
{public static void main(String[] args) throws IOException{/** 接收客戶端發送的數據*/// 1.創建服務器端DatagramSocket,指定端口DatagramSocket socket = new DatagramSocket(12345);// 2.創建數據報,用于接收客戶端發送的數據// 創建字節數組,指定接收的數據包的大小1024byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);System.out.println("****服務器端已經啟動,等待客戶端發送數據");// 3.接收客戶端發送的數據socket.receive(receivePacket);// 4.讀取數據String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("我是服務器,客戶端說:" + receivedMessage);// 5.關閉資源socket.close();}
}

先贊后看,養成習慣!!!^ _ ^ ?? ?? ??
碼字不易,大家的支持就是我的堅持下去的動力。點贊后不要忘了關注我哦!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161783.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161783.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161783.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++單調向量算法:得到山形數組的最少刪除次數

本題的其它解法 C二分算法&#xff1a;得到山形數組的最少刪除次數 題目 我們定義 arr 是 山形數組 當且僅當它滿足&#xff1a; arr.length > 3 存在某個下標 i &#xff08;從 0 開始&#xff09; 滿足 0 < i < arr.length - 1 且&#xff1a; arr[0] < arr[1…

DevOps 事后分析

眾所周知&#xff0c;系統的變化會帶來不穩定&#xff0c;進而引發事故。遷移到 DevOps 使世界各地的組織能夠以更小的增量和更高的頻率進行發布。這降低了特定版本中失敗的風險。另一方面&#xff0c;增加發布數量并不一定會減少待命團隊需要響應的事件數量。 事件響應團隊的…

2023.11.22 homework

七年級數學 五年級數學 也不知道可以教到幾年級&#xff0c;估計很快就教不動了。人生啊。

讀像火箭科學家一樣思考筆記06_初學者之心

1. 專業化是目前流行的趨勢 1.1. 通才&#xff08;generalist&#xff09;是指博而不精之人 1.2. 懂得的手藝越多&#xff0c;反而會家徒四壁 1.2.1. 希臘諺語 1.3. 這種態度代價很大&#xff0c;它阻斷了不同學科思想的交融 2. 組合游戲 2.1. 某個行業的變革可能始于另一…

Pycharm的程序調試

有如下代碼需要進行調試&#xff1a; i 1 while i < 10:print(i)步驟一&#xff1a;設置斷點 步驟二&#xff1a;進入調試視圖 方式1&#xff1a;右鍵單擊編輯區&#xff1a;點擊’Debug模塊名’ ? 方式2&#xff1a;ShiftF9 ? 方式3&#xff1a;單機工具欄上的調試按鈕…

Django報錯:RuntimeError at /home/ 解決辦法

錯誤提示&#xff1a; RuntimeError at /home/ Model class django.contrib.contenttypes.models.ContentType doesnt declare an explicit app_label and isnt in an application in INSTALLED_APPS. 原因剖析&#xff1a; 博主在使用pycharm創建Django項目的時候&#xff0…

vector的簡單模擬實現_C++

目錄 一、vector的數據結構 二、vector的構造 三、vector的增刪查改及空間管理 四、全部代碼 一、vector的數據結構 vector以線性連續空間為基礎來定義數據結構以及擴展功能。vector的兩個迭代器&#xff0c;分別是start和finish&#xff0c;分別指向配置得來的已被使用的空…

網絡滲透測試(wireshark 抓取QQ圖片)

1.打開wireshark 這里我用的wifi連接 所以點開wifi就好 打開wifi之后就開始在本機上進行抓包了 我們先給我們的QQ發送一張圖片&#xff0c;用自己的手機發送給電腦 然后點擊左上角的正方形&#xff0c;停止捕獲抓包 QQ的關鍵詞是oicq&#xff0c;所以我們直接找 打開oicq …

十二、h.264解碼

前言 測試環境&#xff1a; ffmpeg的4.3.2自行編譯版本windows環境qt5.12 完整代碼&#xff1a; H264DncodeThread.h #ifndef H264DNCODETHREAD_H #define H264DNCODETHREAD_H#include <QObject> #include <QThread>extern "C" { #include <libavu…

【論文閱讀筆記】Emu Edit: Precise Image Editing via Recognition and Generation Tasks

【論文閱讀筆記】Emu Edit: Precise Image Editing via Recognition and Generation Tasks 論文閱讀筆記論文信息摘要背景方法結果額外 關鍵發現作者動機相關工作1. 使用輸入和編輯圖像的對齊和詳細描述來執行特定的編輯2. 另一類圖像編輯模型采用輸入掩碼作為附加輸入 。3. 為…

鴻蒙4.0開發筆記之ArkTs語言基礎與基本組件結構(四)

文章聲明&#xff1a;本文關于HarmonyOS系統的部分內容和描述借鑒于華為官網的“HarmonyOS開發者學堂”&#xff0c;有需要的也可以進入官網查看。<HarmonyOS第一課>ArkTS開發語言介紹 一、ArkTs語言介紹 ArkTS是鴻蒙系統&#xff08;HarmonyOS&#xff09;優選的主力應…

設計模式-創建型模式-工廠方法模式

一、什么是工廠方法模式 工廠模式又稱工廠方法模式&#xff0c;是一種創建型設計模式&#xff0c;其在父類中提供一個創建對象的方法&#xff0c; 允許子類決定實例化對象的類型。工廠方法模式是目標是定義一個創建產品對象的工廠接口&#xff0c;將實際創建工作推遲到子類中。…

解讀可解釋性機器學習:理解解釋性基準模型(EBM)

解讀可解釋性機器學習&#xff1a;理解解釋性基準模型&#xff08;EBM&#xff09; 近年來&#xff0c;隨著機器學習模型的復雜性不斷增加&#xff0c;研究人員和從業者對模型的可解釋性提出了更高的要求。可解釋性機器學習&#xff08;Explainable Machine Learning, XAI&…

SHAP - 機器學習模型可解釋性工具

github地址&#xff1a;shap/docs/index.rst at master shap/shap (github.com) SHAP使用文檔&#xff1a;歡迎使用 SHAP 文檔 — SHAP 最新文檔 SHAP介紹 SHAP&#xff08;SHapley Additive exPlanations&#xff09;是一種用于解釋預測結果的方法&#xff0c;它基于Shapley…

實現el-input-number數字框帶單位

實現的效果展示&#xff0c;可以是前綴單位&#xff0c;也可以是后綴單位。實現的思路就是動態修改偽元素 ::before 和 ::after 的 content值 實現二次封裝數字框的代碼如下&#xff1a; <template><el-input-numberref"inputNumber"v-model"inputVal…

opencv-直方圖

直方圖是一種對圖像亮度分布的統計表示&#xff0c;它顯示了圖像中每個灰度級別的像素數量。在OpenCV中&#xff0c;你可以使用cv2.calcHist() 函數計算直方圖。 以下是一個簡單的示例&#xff0c;演示如何計算和繪制圖像的直方圖&#xff1a; import cv2 import numpy as np …

【C++容器】優先級隊列 仿函數 反向迭代器

優先級隊列&#xff0c;仿函數&#xff0c;反向迭代器 優先級隊列認識優先級隊列模擬實現優先級隊列 淺談仿函數仿函數的大致了解仿函數的實現 反向迭代器什么是反向迭代器&#xff1f;反向迭代器的實現 結語 優先級隊列 認識優先級隊列 優先級隊列&#xff08;priority_queue…

Doris分區與分桶(八)

接上篇----------Doris 建表示例 Doris 支持兩層的數據劃分。第一層是 Partition&#xff0c;支持 Range 和 List 的劃分方式。第二層是 Bucket&#xff08;Tablet&#xff09;&#xff0c;僅支持 Hash 的劃分方式。 也可以僅使用一層分區。使用一層分區時&#xff0c;只支持…

低成本打造便攜式無線網絡攻防學習環境

1.摘要 一直以來, 無線網絡安全問題與大眾的個人隱私息息相關, 例如: 為了節省流量, 連接到一個看似安全的免費WiFi, 在使用過程中泄露自己的各類密碼信息甚至銀行卡賬號密碼信息。隨著家用智能電器的普及, 家中的各類智能設備連入家里的無線網絡, 卻突然失靈, 甚至無法正常連…

模擬Spring源碼思想,手寫源碼,理解注解

1、BeanDefinition package com.csdn.myspring; import lombok.AllArgsConstructor; import lombok.Data; Data AllArgsConstructor public class BeanDefinition {private String beanName;private Class beanClass; }2、掃描包的工具類MyTools package com.csdn.myspring; im…