迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等
文章目錄
- 網絡編程概述
- 網絡通信要素
- 要素一IP和端口號
- 要素二網絡協議
- TCP網絡編程
- UDP網絡編程
- URL網絡編程
- Java網絡編程基礎
網絡編程概述
Java是Internet上的語言,它從語言級上提供了對網絡應用程序的支持,程序員能夠很容易開發常見的網絡應用程序。
Java提供的網絡類庫,可以實現無痛的網絡連接,聯網的底層細節被隱藏在 Java 的本機安裝系統里,由 JVM 進行控制。并且Java實現了一個跨平臺的網絡庫,程序員面對的是一個統一的網絡編程環境。
網絡基礎:
①計算機網絡:把分布在不同地理區域的計算機與專門的外部設備用通信線路互連成一個規模大、功能強的網絡系統,從而使眾多的計算機可以方便地互相傳遞信息、共享硬件、軟件、數據信息等資源。
②網絡編程的目的:直接或間接地通過網絡協議與其它計算機實現數據交換,進行通訊。
③網絡編程中有兩個主要的問題:a.如何準確地定位網絡上一臺或多臺主機;定位主機上的特定的應用。 b.找到主機后如何可靠高效地進行數據傳輸。
網絡通信要素
1、IP和端口號
2、網絡通信協議
實現網絡中的主機互相通信:
①通信雙方地址:IP和端口號
②一定的規則:(即網絡通信協議)OSI參考模型:模型過于理想化,未能在因特網上進行廣泛推廣;TCP/IP參考模型(或TCP/IP協議):國際標準。
要素一IP和端口號
IP 地址:InetAddress唯一的標識 Internet 上的計算機(通信實體)。
本地回環地址(hostAddress):127.0.0.1 主機名(hostName):localhost。
IP地址分類方式一:IPV4 和 IPV6
①IPV4:4個字節組成,4個0-255。大概42億,30億都在北美,亞洲4億。2011年初已經用盡。以點分十進制表示,如192.168.0.1。
②IPV6:128位(16個字節),寫成8個無符號整數,每個整數用四個十六進制位表示,數之間用冒號(:)分開,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984
IP地址分類方式二:公網地址(萬維網使用)和私有地址(局域網使用)。192.168.
開頭的就是私有址址,范圍即為192.168.0.0–192.168.255.255,專門為組織機
構內部使用。
不同的進程使用不同的端口號。
被規定為一個 16 位的整數 0~65535。
端口分類:
①公認端口:0~1023。被預先定義的服務通信占用(如:HTTP占用端口80,FTP占用端口21,Telnet占用端口23)
②注冊端口:1024~49151。分配給用戶進程或應用程序。(如:Tomcat占用端口8080,MySQL占用端口3306,Oracle占用端口1521等)。
③動態/私有端口:49152~65535。
端口號與IP地址的組合得出一個網絡套接字:Socket。
Internet上的主機有兩種方式表示地址:
①域名(hostName):www.baidu.com
②IP 地址(hostAddress):202.108.22.5
域名解析:域名容易記憶,當在連接網絡時輸入一個主機的域名后,域名服務器(DNS)負責將域名轉化成IP地址,這樣才能和主機建立連接。
在Java中
InetAddress類主要表示IP地址,兩個子類:Inet4Address、Inet6Address。
InetAddress類對象含有一個Internet主機地址的域名和IP地址。
InetAddress類沒有提供公共的構造器,而是提供了如下幾個靜態方法來獲取
InetAddress實例:
①public static InetAddress getLocalHost():本機
②public static InetAddress getByName(String host):指定host
InetAddress常用方法:
①public String getHostAddress():返回 IP 地址字符串(以文本表現形式)。
②public String getHostName():獲取此 IP 地址的主機名
③public boolean isReachable(int timeout):測試是否可以達到該地址
要素二網絡協議
網絡通信協議:計算機網絡中實現通信必須有一些約定,即通信協議,對速率、傳輸代碼、代碼結構、傳輸控制步驟、出錯控制等制定標準。
通信協議分層的思想:在制定協議時,把復雜成份分解成一些簡單的成份,再將它們復合起來。最常用的復合方式是層次方式,即同層間可以通信、上一層可以調用下一層,而與再下一層不發生關系。各層互不影響,利于系統的開發和擴展。
傳輸層協議中有兩個非常重要的協議:
①傳輸控制協議TCP(Transmission Control Protocol)
②用戶數據報協議UDP(User Datagram Protocol)
TCP/IP協議簇:以其兩個主要協議:傳輸控制協議(TCP)和網絡互聯協議(IP)而得
名,實際上是一組協議,包括多個具有不同功能且互為關聯的協議。
IP(Internet Protocol)協議是網絡層的主要協議,支持網間互連的數據通信。
TCP/IP協議模型從更實用的角度出發,形成了高效的四層體系結構,即物理鏈路層、IP層、傳輸層和應用層。
TCP協議:
①使用TCP協議前,須先建立TCP連接,形成傳輸數據通道
②傳輸前,采用“三次握手”方式,點對點通信,是可靠的
③TCP協議進行通信的兩個應用進程:客戶端、服務端。
④在連接中可進行大數據量的傳輸
⑤傳輸完畢,需釋放斷開已建立的連接,采用“四次握手”,方式效率低
UDP協議:
①將數據、源、目的封裝成數據包,不需要建立連接
②每個數據報的大小限制在64K內
③發送不管對方是否準備好,接收方收到也不確認,故是不可靠的
④可以廣播發送
⑤發送數據結束時無需釋放資源,開銷小,速度快
利用套接字(Socket)開發網絡應用程序早已被廣泛的采用,以至于成為事實上的標準。網絡上具有唯一標識的IP地址和端口號組合在一起才能構成唯一能識別的標識符套接字。
通信的兩端都要有Socket,是兩臺機器間通信的端點。網絡通信其實就是Socket間的通信。Socket允許程序把網絡連接當成一個流,數據在兩個Socket間通過IO傳輸。一般主動發起通信的應用程序屬客戶端,等待通信請求的為服務端。
Socket分類:
①流套接字(stream socket):使用TCP提供可依賴的字節流服務
②數據報套接字(datagram socket):使用UDP提供“盡力而為”的數據報服務
TCP網絡編程
基于Socket的TCP編程:Java語言的基于套接字編程分為服務端編程和客戶端編程,其通信模型如圖所示:
客戶端Socket的工作過程包含以下四個基本的步驟:
①創建 Socket:根據指定服務端的 IP 地址和端口號構造 Socket 類對象。若服務器端響應,則建立客戶端到服務器的通信線路。若連接失敗,會出現異常。
②打開連接到 Socket 的輸入輸出流:使用 getInputStream()方法獲得輸入流,使用getOutputStream()方法獲得輸出流,進行數據傳輸。
③按照一定的協議對 Socket 進行讀/寫操作:通過輸入流讀取服務器放入線路的信息(但不能讀取自己放入線路的信息),通過輸出流將信息寫入線程。
④關閉 Socket:斷開客戶端到服務器的連接,釋放線路。
客戶端程序可以使用Socket類創建對象,創建的同時會自動向服務器方發起連接。Socket的構造器是:
Socket(String host,int port)throws UnknownHostException,IOException:向服務器(域名是host,端口號為port)發起TCP連接,若成功,則創建Socket對象,否則拋出異常。
Socket(InetAddress address,int port)throws IOException:根據InetAddress對象所表示的IP地址以及端口號port發起連接。
服務器程序的工作過程包含以下四個基本的步驟:
①調用 ServerSocket(int port) :創建一個服務器端套接字,并綁定到指定端口上。用于監聽客戶端的請求。
②調用 accept():監聽連接請求,如果客戶端請求連接,則接受連接,返回通信
套接字Socket對象。
③調用該Socket類對象的 getOutputStream() 和 getInputStream ():獲取輸出流和輸入流,開始網絡數據的發送和接收。
④關閉ServerSocket和Socket對象:客戶端訪問結束,關閉通信套接字。
ServerSocket 對象負責等待客戶端請求建立套接字連接,服務器必須事先建立一個等待客戶請求建立套接字連接的ServerSocket對象。所謂“接收”客戶的套接字請求,就是accept()方法會返回一個 Socket 對象。
ServerSocket ss = new ServerSocket(999); Socket s = ss.accept (); InputStream in = s.getInputStream(); 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(); ss.close();示例:從客戶端發送文件給服務端,服務端保存到本地,返回“發送成功”給客戶端,并關閉相應的連接:
①服務器端
②客戶端
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket;/*** @Author: Yeman* @Date: 2021-09-27-22:28* @Description:*/ public class Client {public static void main(String[] args) {Socket socket = null;FileInputStream fis = null; //獲取要進行傳輸的本地文件try {socket = new Socket(InetAddress.getLocalHost(), 999);OutputStream outputStream = socket.getOutputStream(); //輸出流,進行發送fis = new FileInputStream("IO\\input.jpg");byte[] bytes = new byte[1024];int len = fis.read(bytes);while (len != -1){outputStream.write(bytes,0,len);outputStream.flush();len = fis.read(bytes);}socket.shutdownOutput(); //在流末尾寫一個標記,這樣服務器端才能讀到-1InputStream inputStream = socket.getInputStream();byte[] bytesR = new byte[1024];int length = inputStream.read(bytesR);while (length != -1){System.out.println(new String(bytesR,0,length));length = inputStream.read(bytesR);}} catch (IOException e) {e.printStackTrace();} finally {try {if (fis != null)fis.close();} catch (IOException e) {e.printStackTrace();}try {if (socket != null) socket.close();} catch (IOException e) {e.printStackTrace();}}} }UDP網絡編程
DatagramSocket 和 DatagramPacket 類實現了基于 UDP 協議網絡程序。
UDP數據報通過數據報套接字 DatagramSocket 發送和接收,系統不保證UDP數據報一定能夠安全送到目的地,也不能確定什么時候可以抵達。
DatagramPacket 對象封裝了UDP數據報,在數據報中包含了發送端的IP地址和端口號以及接收端的IP地址和端口號。
UDP協議中每個數據報都給出了完整的地址信息,因此無須建立發送方和接收方的連接。
流程:
①DatagramSocket與DatagramPacket
②建立發送端,接收端
③建立數據包
④調用Socket的發送、接收方法
⑤關閉Socket
示例:
①接收端
②發送端
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;/*** @Author: Yeman* @Date: 2021-09-27-22:28* @Description:*/ public class Client {public static void main(String[] args) {DatagramSocket ds = null;try {ds = new DatagramSocket();byte[] bytes = "Hello World!".getBytes();InetAddress lh = InetAddress.getLocalHost();DatagramPacket dp = new DatagramPacket(bytes, bytes.length, lh, 9990);ds.send(dp);} catch (IOException e) {e.printStackTrace();} finally {if (ds != null) ds.close();}} }URL網絡編程
URL(Uniform Resource Locator):統一資源定位符,它表示 Internet 上某一資源的地址。它是一種具體的URI,即URL可以用來標識一個資源,而且還指明了如何locate這個資源。
通過 URL 我們可以訪問 Internet 上的各種網絡資源,比如最常見的 www,ftp 站點。瀏覽器通過解析給定的 URL 可以在網絡上查找相應的文件或其他資源。
URL的基本結構由5部分組成:
<傳輸協議>://<主機名>:<端口號>/<文件名>#片段名?參數列表例如:
http://192.168.1.100:8080/helloworld/index.jsp#a?username=shkstart&password=123#片段名:即錨點,例如看小說,直接定位到章節
參數列表格式:參數名=參數值&參數名=參數值…
為了表示URL,java.net 中實現了類 URL。我們可以通過下面的構造器來初始化一個 URL 對象:
一個URL對象生成后,其屬性是不能被改變的,但可以通過它給定的方法來獲取這些屬性:
URL的方法 openStream():能從網絡上讀取數據,若希望輸出數據,例如向服務器端的 CGI (公共網關接口-Common Gateway Interface-的簡稱,是用戶瀏覽器和服務器端的應用程序進行連接的接口)程序發送數據,則必須先與URL建立連接,然后才能對其進行讀寫,此時需要使用 URLConnection 。
URLConnection:表示到URL所引用的遠程對象的連接。當與一個URL建立連接時,首先要在一個 URL 對象上通過方法openConnection()生成對應URLConnection對象。如果連接過程失敗,將產生IOException。
URL netchinaren = new URL ("http://www.taobao.com/index.shtml"); URLConnectonn u = netchinaren.openConnection( );通過URLConnection對象獲取的輸入流和輸出流,即可以與現有的CGI程序進行交互。
示例:下載網絡上一張圖片
Java網絡編程基礎
位于網絡中的計算機具有唯一的IP地址,這樣不同的主機可以互相區分。
客戶端-服務器是一種最常見的網絡應用程序模型。服務器是一個為其客戶端提供某種特定服務的硬件或軟件。客戶機是一個用戶應用程序,用于訪問某臺服務器提供的服務。端口號是對一個服務的訪問場所,它用于區分同一物理計算機上的多個服務。套接字用于連接客戶端和服務器,客戶端和服務器之間的每個通信會話使用一個不同的套接字。
Java 中有關網絡方面的功能都定義在 java.net 程序包中。Java 用 InetAddress 對象表示 IP 地址,該對象里有兩個字段:主機名(String) 和 IP 地址(int)。
類 Socket 和 ServerSocket 實現了基于TCP協議的客戶端-服務器程序。Socket是客戶端和服務器之間的一個連接,連接創建的細節被隱藏了。這個連接提供了一個安全的數據傳輸通道,這是因為 TCP 協議可以解決數據在傳送過程中的丟失、損壞、重復、亂序以及網絡擁擠等問題,它保證數據可靠的傳送。
類 URL 和 URLConnection 提供了最高級網絡應用。URL 的網絡資源的位置來同一表示 Internet 上各種網絡資源。通過URL對象可以創建當前應用程序和 URL 表示的網絡資源之間的連接,這樣當前程序就可以讀取網絡資源數據,或者把自己的數據傳送到網絡上去。
總結
以上是生活随笔為你收集整理的迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑常用字体库下载(电脑常用字体库下载安
- 下一篇: 一个小例子体会Java反射的动态性