




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第11章章 Java 中的網絡編程中的網絡編程 本章導讀本章導讀n URL類n 讀取URL中的資源n 顯示URL資源中的HTML文件n 處理超鏈接n InetAddress類n 套接字Socketn 使用多線程處理套接字連接n UDP數據報n 廣播數據n Java遠程調用1概述概述 本章重點介紹4個重要的類URL、Socket、InetAddress和DatagramSocket。 網絡的一些基本知識 : IP(Internet Protocol)地址:地址:IP地址是用于惟一標識連接到Internet的計算機的數字地址是由32位二進制數組成,如。沒有IP地址就不能區
2、分連在Internet上不同的計算機。 域名域名:用字符形式表示連接到Internet的計算機的數字地址。如域名“”和IP“10”是一個主機的兩種表示法。 域名服務器(域名服務器(DNS):):負責將域名與IP地址的轉化。 URL(Uniform Resource Locator,統一資源定位符):標識了計算機上的資源。一個URL通常包含一些重要的信息,如http:/ http http 服務使用的協議(HTTP)。n 存儲資源的計算機的域名地址。n hotlink.htmlhotlink.html 資源。客戶服務器體系結構: 客戶需要某些類型的信息,而服務器提供客戶所
3、需要的信息。客戶需要連接到服務器上,并向服務器請求信息,服務器則向客戶發送信息,兩者按照協議協同工作,各得其所。 211.1 URL類 包中的 URL類是對URL的抽象,使用URL創建對象的應用程序稱為客戶端程序,一個URL對象存放著一個具體的資源的引用,表明客戶要訪問這個URL中的資源,利用URL對象可以獲取URL中的資源。 一個URL對象通常包含最基本的三部分信息協議、地址、資源。URL的構造方法的構造方法 public URL(String spec) throws MalformedURLExceptionpublic URL(String spec) throws Malformed
4、URLException 使用字符串初始化一個URL對象,如 try url=new URL(http:/);try url=new URL(http:/); catch(MalformedURLException e) catch(MalformedURLException e) System.out.println (Bad URL:+url); System.out.println (Bad URL:+url); 該URL對象使用的協議是HTTP,即用戶按照這種協議與指定的服務器通信,該URL對象包含的地址是“”,所包含的資源是默認的資源(主頁)。public URL(String pr
5、otocol,String host,String file) throws MalformedURLExceptionpublic URL(String protocol,String host,String file) throws MalformedURLException 構造的URL對象的協議、地址和資源分別由參數protocol、host和file指定。311.2 讀取URL中的資源 URL對象調用InputStream openStream() 方法方法可以返回一個輸入流,該輸入流指向URL對象所包含的資源。通過該輸入流可以將服務器上的資源信息讀入到客戶端。 例11-1(效果如圖
6、11.1所示)在一個文本框中輸入網址,然后單擊“確定”按鈕讀取服務器上的資源。由于 網 絡 速 度 或 其 他 因素,URL資源的讀取可能會引起堵塞,因此程序需在一個線程中讀取URL資源,以免堵塞主線程。411.3 顯示URL資源中的HTML文件 在上面的例11-1中, http:/的主頁的內容顯示在文本區中,但有時候我們想看到網頁的運行效果。javax.swing包中的JEditorPane類可以解釋執行html文件。也就是說,如果把html文件讀入到JEditorPane,該html文件就會被解釋執行,顯示在JEditorPane中,這樣程序就看到了網頁的運行效果。JEditorPane類
7、的構造方法類的構造方法 public JEditorPane() public JEditorPane(URL initialPage) throws IOException public JEditorPane(String url) throws IOException 后兩個構造方法使用參數initialPage或url指定該對象最初顯示的URL中的資源。JEditorPane對象調用public void setPage(URL page) throws IOException方法可以顯示新的URL中的資源。 例例11-2用JEditorPane對象顯示網頁,效果如圖11.2所示。5例
8、例11-2 運行效果圖11.2圖11.2 顯示網頁611.4 處理超鏈接 當JEditorPane對象調用setEditable()方法方法將編輯屬性設為false時,不僅可以顯示網頁的運行效果,而且用戶如果單擊網頁中超鏈接,還可以使得JEditorPane對象對象觸發HyperlinkEvent事件事件。 程序可以通過處理HyperlinkEvent事件事件,來顯示新的URL資源。JEditorPane對象調用addHyperlinkListener(HyperlinkListener listener) 獲得監視器。監視器需實現HyperlinkListener接口接口,該接口中的方法是:
9、void hyperlinkUpdate(HyperlinkEvent e) 例例11-3中中,當單擊超鏈接時,JEditorPane對象將顯示超鏈接所鏈接的網頁。711.5 InetAddress類 包中的InetAddress類對象含有一個Internet主機地址的域名和IP地址: 。域名容易記憶,在連接網絡時輸入一個主機的域名后,域名服務器(DNS)負責將域名轉化成IP地址,這樣我們才能和主機建立連接。1獲取獲取Internet上主機的地址上主機的地址 可以使用InetAddress類的靜態方法getByName(String s);將一個域名或IP地址傳遞給該方法的參數s,獲得一個In
10、etAddress對象。該對象含有主機地址的域名和IP地址,該對象用如下格式表示它包含的信息: 例例11-4分別獲取域名是的主機域名和IP地址,同時獲取IP地址是的主機域名。注:注:運行上述程序時應保證已經連接到Internet上。 上述程序的運行結果如下: public String getHostName() 獲取InetAddress對象所含的域名。 public String getHostAddress() 獲取InetAddress對象所含的IP地址。2獲取本地機的地址獲取本地機的地址 可以使用InetAddress類的靜態方法getLocalHost()
11、;獲得一個InetAddress對象,該對象含有本地機的域名和IP地址。811.6 套接字Socket IP地址標識Internet上的計算機,端口號端口號標識正在計算機上運行的進程(程序)。 端口號端口號與IP地址的組合得出一個網絡套接字網絡套接字。 端口號端口號被規定為一個16位的整數065535。其中,01023被預先定義的服務通信占用, 應該使用102465535這些端口中的某一個進行通信,以免發生端口沖突。 當兩個程序需要通信時,它們可以通過使用Socket類類建立套接套接字對象字對象并連接在一起。比如,有人讓你去“中山廣場郵局”,你可能反問“我去做什么”,因為他沒有告知你“端口”,
12、你不知處理何種業務。他說:“中山廣場郵局,8號窗口”,那么你到達地址“中山廣場郵局”,找到“8號”窗口,就知道 8號窗口處理特快專遞業務,而且必須有個先決條件,就是你到達“中山廣場郵局,8號窗口”時,該窗口必須有一位業務員在等待客戶,否則就無法建立通信業務。 套接字連接,套接字連接,就是客戶端的套接字對象和服務器端的套接字對象通過輸入輸出流連接在一起,現在我們分3個步驟來說明套接字連接的基本模式。 911.6 套接字連接_(1)服務器建立ServerSocket對象 ServerSocket對象對象負責等待客戶端請求建立套接字連接。 服務器必須事先建立一個等待客戶請求建立套接字連接的Serve
13、rSocket對象對象。 ServerSocket的構造方法是ServerSocket(int port) ; port是一個端口號,必須和客戶請求的端口號相同。 當建立服務器套接字時可能發生IOException異常異常,因此要像下面那樣建立接收客戶的服務器套接字。 try ServerSocket waitSocketConnection=new ServerSocket(1880); catch(IOException e)10續 11.6 套接字連接_(1)服務器建立ServerSocket對象 當服務器的ServerSocket對象對象waitSocketConnection建立后,
14、就可以使用方法accept()接受客戶的套接字連接請求,如下所示: waitSocketConnection.accept(); 接收客戶的套接字也可能發生IOException異常異常,因此要像下面那樣建立接收客戶的套接字。 try Socket socketAtServer= waitSocketConnection.accept(); catch(IOException e) 所謂接收客戶的套接字請求,就是accept()方法方法會返回一個Socket對象對象socketAtServer(服務器端的套接字對象)。但是,accept()方法方法不會立刻返回,該方法會堵塞服務器端當前線程的執
15、行,直到有客戶端請求建立套接字連接。就是說,如果沒有客戶請求建立套接字連接,那么下述代碼中的System.out.println(ok);總不會被執行:try Socket socketAtServer = waitSocketConnection.accept(); System.out.println(ok)catch(IOException e)注:注:ServerSocket對象可以調用setSoTimeout(int timeout)方法設置超時值(單位是毫秒),timeout是一個正值。當ServerSocket對象調用accept()方法堵塞的時間一旦超過timeout時,將觸發
16、SocketTimeoutException。1111.6 套接字連接_(2)客戶端創建Socke對象 客戶端程序可以使用Socket類類創建對象 Socket的構造方法如下:Socket(String host,int port)參數host是服務器的IP地址,port是一個端口號。 創建Socket對象可能發生IOException異常異常,因此要像下面那樣建立到服務器的套接字連接。 try Socket socketAtClient=new Socket(8,1880); catch(IOException e) 客戶端建立socketAtClient對
17、象對象的過程就是向服務器發出套接字連接請求,如果服務器端相應的端口上有ServerSocket對象對象正在使用accept()方法方法等待客戶,那么雙方的套接字對象對象socketAtClient和和socketAtServer就都誕生了。也可以使用Socket類不帶參數的構造方法public Socket() 創建一個套接字對象,該對象不請求任何連接。該對象再調用 public void connect(SocketAddress endpoint) throws IOException請求與參數SocketAddress指定地址的套接字建立連接。 為了使用connect()方法方法,可以使
18、用SocketAddress的子類子類InetSocketAddress創建一個對象,InetSocketAddress的構造方法如下: public InetSocketAddress(InetAddress addr,int port)1211.6 套接字連接_(3)流連接 客戶端和服務器端的套接字對象誕生以后,還必須進行輸入輸出流的連接。 服務器端的這個Socket對象對象socketAtServer使用方法getOutputStream()獲得的輸出流將指向客戶端Socket對象對象socketAtClient使用方法方法getInputStream()獲得的那個輸入流。 同樣,服務器
19、端的這個Socket對象對象socketAtServer使用方法getInputStream()獲得的輸入流將指向客戶端Socket對象對象socketAtClient使用方法getOutputStream()獲得的那個輸出流。 因此,當服務器向這個輸出流寫入信息時,客戶端通過相應的輸入流就能讀取,反之亦然,如圖圖11.3套接字連接示意圖套接字連接示意圖所示。 連接建立后,服務器端的套接字對象調用getInetAddress()方法方法可以獲取一個InetAddess對象對象,該對象含有客戶端的IP地址和域名。 同樣,客戶端的套接字對象調用getInetAddress()方法方法可以獲取一個I
20、netAddess對象對象,該對象含有服務器端的IP地址和域名。 套接字調用close()方法方法可以關閉雙方的套接字連接,只要一方關閉連接,就會導致對方發生IOException異常。 例例11-5中中,客戶端向服務器發出ASCII表的順序值1127, 服務器接收這些數據,并將順序值對應的字符返回給客戶。效果如圖效果如圖11.4, 11.5所示所示 。13 圖11.3 套接字連接示意圖14 例例11-5中運行中運行效果圖11.4, 11.51511.7 使用多線程處理套接字連接 套接字連接中涉及到輸入流和輸出流操作,客戶端或服務器讀取數據可能會引起堵塞,我們應把讀取數據放在一個單獨的線程中去
21、進行。另外,服務器收到一個客戶的套接字后,就應該啟動一個專門為該客戶服務的線程。 例例11-6中中,客戶輸入一個一元二次方程的系數并發送給服務器,服務器把計算出的方程的實根返回給客戶。因此,用戶可以將計算量大的工作放在服務器端,客戶端負責計算量小的工作,實現客戶服務器交互計算,來完成某項任務。效果如圖效果如圖11.6, 11.7所示所示 。 首先將例11-6中服務器端的程序編譯通過,并運行起來,等待客戶的呼叫。16 例例11-6中運行中運行效果圖11.6, 11.71711.8 UDP數據報_概述 前面學習了基于TCP協議的網絡套接字(Socket),套接字屬于有連接的通信方式,非常像生活中的
22、電話通信,一方呼叫,另一方負責監聽,一旦建立了連接,雙方就可以進行通信了。 本節將介紹Java中基于UDP(用戶數據報協議)的網絡信息傳輸方式。基于UDP的通信和基于TCP的通信不同,基于UDP的信息傳遞更快,但不提供可靠性保證。也就是說,數據在傳輸時,用戶無法知道數據能否正確到達目的地主機,也不能確定數據到達目的地的順序是否和發送的順序相同。 既然UDP是一種不可靠的協議,為什么還要使用它呢?如果要求數據必須絕對準確地到達目的地,顯然不能選擇UDP協議來通信。但有時候人們需要較快速地傳輸信息,并能容忍小的錯誤,就可以考慮使用UDP協議。 基于UDP通信的基本模式是如下:將數據打包,稱為數據報
23、,然后將數據報發往目的地;接受別人發來的數據報,然后查看數據報中的內容。 1811.8 UDP數據報_1發送數據 1)創建創建DatagramPacket對象對象 用DatagramPacket類類將數據打包,即用DatagramPacket類類創建一個對象,稱為數據報。用DatagramPacket的類類以下兩個構造方法創建待發送的數據報: DatagramPacket(byte data ,int length,InetAddtress address,int port) DatagramPacket(byte data ,int offset,int length,InetAddtres
24、s address,int port)使用構造方法創建的數據報對象具有下列兩個性質: 含有data數組指定的數據。該數據報將發送到地址是address、端口號是port的主機上。 稱address是它的目標地址,port是這個數據報的目標端口號。第2個構造方法創建的數據報對象含有數組data從offset開始指定長度的數據。例如, byte data =近來好嗎近來好嗎.getByte(); InetAddtress address=InetAddtress.getName(); DatagramPacket data_pack=new DatagramPacket(data,data.len
25、gth, address,980);注:注:用上述方法創建的用于發送的數據報數據報data_packdata_pack調用方法public int getPort()可以獲取該數據報目標端口號;調用方法方法public InetAddress getAddres()可以獲取這個數據報的目標地址;調用方法方法public byet getData()可以獲取數據報中的數據。2)發送數據發送數據 用DatagramSocket類的不帶參數的構造方法構造方法DatagramSocket()創建一個對象,該對象負責發送數據報。例如 DatagramSocket mail_out=new Datagra
26、mSocket(); mail_out.send(data_pack);1911.8 UDP數據報_2接收數據 用DatagramSocket類另一個構造方法DatagramSocket(int port)創建一個對象,其中的參數必須和待接收的數據報的端口號相同。例如,如果發送方發送的數據報的端口號是5666:DatagramSocket mail_in=new DatagramSocket(5666);該對象對象mail_in使用方法receive(DatagramPacket pack)接收數據報。該方法有一個數據報參數pack,方法方法receive()把收到的數據報傳遞給該參數。因此,
27、我們必須預備一個數據報以便收取數據報。這時需使用DatagramPacket類類的另外一個構造方法DatagramPacket(byte data,int length)創建一個數據報,用于接收數據報。例如,byte data=new byte100;int length=90; DatagramPacket pack=new DatagramPacket(data,length); mail_in.receive(pack);該數據報pack將接收長度是length的數據放入data。注:注: receive()方法方法可能會堵塞,直到收到數據報。 如果pack調用方法方法getPort()
28、可以獲取所收數據報是從遠程主機上的哪個端口發出的,即可以獲取包的始發端口號;調用方法方法InetAddress getAddres()可獲取這個數據報來自哪個主機,即可以獲取包的始發地址。我們稱主機發出數據報使用的端口號為該包的始發端口號,發送數據報的主機地址稱為數據報的始發地址。 數據報數據的長度不要超過8192k。 例例11-7中中,兩個主機(可用本地機模擬)互相發送和接收數據報。2011.9 廣播數據包 廣播數據報類似于電臺廣播,進行廣播的電臺需在指定的波段和頻率上廣播信息,接收者只有將收音機調到指定的波段、頻率上才能收聽到廣播的內容。 廣播數據報涉及到地址和端口地址和端口。 Inter
29、net的地址是a.b.c.d的形式。該地址的一部分代表用戶自己主機自己主機,而另一部分代表用戶所在的網絡所在的網絡。當a小于128,那么b.c.d就用來表示主機,這類地址稱做A類地址。如果a大于等于128并且小于192,則a.b表示網絡地址,而c.d表示主機地址,這類地址稱做B類地址。如果a大于等于192,則網絡地址是a.b.c,d表示主機地址,這類地址稱做C類地址。與55之間的地址稱做D類地址,D類地址并不代表某個特定主機的位置。 一個具有A、B或C類地址的主機要廣播數據或接收廣播,都必須加入到同一個D類地址。一個D類地址也稱做一個組播地址,加入到
30、同一個組播地址的主機可以在某個端口上廣播信息,也可以在某個端口號上接收信息。 準備廣播或接收的主機需經過下列步驟:準備廣播或接收的主機需經過下列步驟:1設置組播地址設置組播地址 使用InetAddress類創建組播組地址,如 InetAddress group=InetAddress.getByName();2創建多點廣播套接字創建多點廣播套接字 使用MulticastSocket類類創建一個多點廣播套接字對象。MulticastSocket的構造方法如下:public MulticastSocket(int port) throws IOException 創建的多點廣
31、播套接字可以在參數指定的端口上廣播。2111.9 廣播數據包 _23設置廣播的范圍設置廣播的范圍 準備廣播的主機必須讓多點廣播套接字(MulticastSocket)對象調用public void setTimeToLive(int ttl) throws IOException方法設置廣播的范圍。其中參數ttl的取值范圍是0255,代表廣播的數據能經過的路由器的最大數目。4加入組播組加入組播組 準備廣播或接收的主機必須讓多點廣播套接字(MulticastSocket) 對象調用public void joinGroup(InetAddress mcastaddr) throws IOExce
32、ption方法加入組播組。 多點廣播套接字(MulticastSocket)對象調用public void leaveGroup(InetAddress mcastaddr) throws IOException方法可以離開已經加入的組播組。5廣播數據和接收數據廣播數據和接收數據 進行廣播的主機可以讓多點廣播套接字(MulticastSocket)對象調用public void send(DatagramPacket p) throws IOException將參數p指定的數據報廣播到組播組中的其他主機。 接收廣播的主機可以讓多點廣播套接字(MulticastSocket)對象調用public
33、 void receive(DatagramPacket p) throws IOException方法接收廣播的數據報中的數據,并將接收的數據存放到參數p指定的數據報中。 例例11-8中中,一個主機不斷地重復廣播奧運會新聞,加入到同一組的主機都可以隨時接收廣播的信息。接收者將正在接收的信息放入一個文本區,把已接收到的全部信息放入另一個文本區。2211.10 Java遠程調用遠程調用 Java遠程調用(Remote Method Invocation,RMI)是一種分布式技術,使用RMI可以讓一個虛擬機上的應用程序請求調用位于網絡上另一處虛擬機上的對象。習慣上稱發出調用請求的虛擬機為(本地)客
34、戶機,稱接受并執行請求的虛擬機為(遠程)服務器。 2311.10 Java遠程調用遠程調用_1遠程對象及其代理遠程對象及其代理 1 ) 遠程對象遠程對象 駐留在(遠程)服務器上的對象是客戶要請求的對象,稱作遠程對象,即客戶程序請求遠程對象調用方法,然后遠程對象調用方法并返回必要的結果。2) 代理與存根(代理與存根(Stub) RMI不希望客戶應用程序直接與遠程對象打交道,代替地讓用戶程序和遠程對象的代理打交道。代理的特點是它與遠程對象實現了相同的接口,當用戶請求代理調用這樣的方法時,如果代理確認遠程對象能調用相同的方法時,就把實際的方法調用委派給遠程對象。 RMI會幫助生成一個存根(Stub)
35、:一種特殊的字節碼,并讓這個存根產生的對象做為遠程對象的代理。代理需要駐留在客戶端。因此,在RMI中,用戶實際上是在和遠程對象的代理直接打交道,用戶想請求遠程對象調用某個方法,只需向遠程代理發出同樣的請求即可,如圖如圖11.8所示所示。3) Remote接口接口 RMI為了標識一個對象是遠程對象,即可以被客戶請求的對象,要求遠程對象必須實現java.rmi包中的Remote接口,也就是說只有實現該接口的類的實例才被RMI認為是一個遠程對象。Remote接口中沒有方法,該接口僅僅起到一個標識作用,因此,必須擴展Remote接口,以便規定遠程對象的那些方法是客戶可以請求的方法,用戶程序不必編寫和遠
36、程代理的有關代碼,只需知道遠程代理和遠程對象實現了相同的接口。24 圖11.8 遠程代理與遠程對象 2511.10 2RMIRMI的設計細節的設計細節 _ _1)1)擴展擴展RemoteRemote接口接口 為了敘述的方便,我們假設本地客戶機存放有關類的目錄是D:Client;遠程服務器的IP是,存放有關類的目錄是D:Server。1)1)擴展擴展RemoteRemote接口接口 定義一個接口是java.rmi包中Remote的子接口,即擴展Remote接口。 以下是我們定義的Remote的子接口是RemoteSubject。RemoteSubject子接口中定義了計算面積的
37、方法,即要求遠程對象為用戶計算某種幾何圖形的面積。RemoteSubject的代碼如下: import java.rmi.*; public interface RemoteSubject extends Remote public void setHeight(double height) throws RemoteException; public void setWidth(double width) throws RemoteException; public double getArea() throws RemoteException; 該接口需要保存在前面約定的遠程服務器的D:S
38、erver目錄中,并編譯它生成相應的.class字節碼文件。由于客戶端的遠程代理也需要該接口,因此需要將生成的字節碼文件RmoteSubject.class復制到前面約定的客戶機的D:Client目錄中。2611.10 2RMIRMI的設計細節的設計細節 _ _2 2)遠程對象)遠程對象 創建遠程對象的類必須要實現RemoteRemote接口接口,RMI使用Remote接口來標識遠程對象。RemoteRemote接口接口中沒有方法,因此創建遠程對象的類需要實現Remote接口的一個子接口。RMI為了讓一個對象成為遠程對象還需要進行一些必要初始化工作,在編寫創建遠程對象的類時,可以簡單讓該類是R
39、MI提供的java.rmi.server包中的UnicastRemoteObject類的子類即可。 以下是我們定義的創建遠程對象的類,該類是UnicastRemoteObjectUnicastRemoteObject類類的子類并實現了上述RemoteSubjectRemoteSubject接口接口,所創建的遠程對象可以計算矩形的面積. import java.rmi.*;import java.rmi.server.UnicastRemoteObject;public class RemoteConcreteSubject extends UnicastRemoteObject impleme
40、nts RemoteSubject double width,height; public RemoteConcreteSubject() throws RemoteException public void setWidth(double width) throws RemoteException this.width=width; public void setHeight(double height) throws RemoteException this.height=height; public double getArea() throws RemoteException retu
41、rn width*height; 2711.10 2RMIRMI的設計細節的設計細節 _ _3 3)存根()存根(StubStub)與代理)與代理 RMI負責產生存根(Stub Object),如果創建遠程對象的字節碼是RemoteConcreteSubject.class,那么存根(Stub)的字節碼是RemoteConcreteSubject_Stub.class,即后綴為_Stub。 RMI使用rmic命令生成存根:RemoteConcreteSubject_Stub.class。首先進入D:Server目錄,然后如下執行rmic命令:rmic RemoteConcreteSubject
42、rmic RemoteConcreteSubject如圖11.9所示。 執行過rmicrmic命令命令將產生存根 RemoteConcreteSubject_Stub.class(在D:Server中)。 客戶端需要使用存根(Stub)來創建一個對象,即遠程代理,因此需要將RemoteConcreteSubject_Stub.class復制到前面約定的客戶機的D:Client目錄中。2811.10 2RMIRMI的設計細節的設計細節 _ _4 4)啟動注冊()啟動注冊(rmiregistryrmiregistry) 在遠程服務器創建遠程對象之前,RMI要求遠程服務器必須首先啟動注冊:rmiregistry,只有啟動了rmiregistry,遠程服務器才可以創建遠程對象,并將該對象注冊到rmiregistry所管理的注冊表中。 在遠程服務器開啟一個終端,比如在MS-DOS命令行窗口進入D:Server目錄,然后執行rimregistry命令:rmiregistryrmiregistry啟動注冊,如圖11.10所示。也可以后臺啟動注冊:start rmiregistrystart rmiregistry2911.10 2RMIRMI的設計細節的設計細節 _ _5 5)啟動遠程對象服務)啟動遠
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年腈綸扁平絲項目合作計劃書
- 2025鋁材購銷合同
- 2025共同經營合同范本
- 2025年智能兒童成長儀項目建議書
- 2025咨詢服務合同變更協議書
- 2025年商業專用設備:條碼設備項目合作計劃書
- 2025年玻纖網項目建議書
- 2025年導游人員資格考試試題及答案
- 草坪柵欄施工方案
- 2025年不孕不育醫院項目合作計劃書
- 合作聯展合同模板
- LNG冷能利用介紹
- 三年級語文下冊 第19課《剃頭大師》同步訓練題(含答案)(部編版)
- 安全生產特種設備日管控、周排查月調度工作制度
- 臨時用電施工組織設計-完整
- 2023年高考遼寧卷化學真題(解析版)
- 第三章物流節點選址模型與方法
- 糧油食材配送投標方案(大米食用油食材配送服務投標方案)(技術方案)
- DB3301∕T 65.28-2024 反恐怖防范系統管理規范 第28部分:硬質隔離設施
- 新解讀《JTGT 3660-2020公路隧道施工技術規范》
- 北京版小學英語1至6年級詞匯
評論
0/150
提交評論