Java程序設(shè)計(jì)模塊9網(wǎng)絡(luò)編程_第1頁(yè)
Java程序設(shè)計(jì)模塊9網(wǎng)絡(luò)編程_第2頁(yè)
Java程序設(shè)計(jì)模塊9網(wǎng)絡(luò)編程_第3頁(yè)
Java程序設(shè)計(jì)模塊9網(wǎng)絡(luò)編程_第4頁(yè)
Java程序設(shè)計(jì)模塊9網(wǎng)絡(luò)編程_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

模塊9

網(wǎng)絡(luò)編程目標(biāo)知識(shí)目標(biāo):技能目標(biāo):素質(zhì)目標(biāo):掌握網(wǎng)絡(luò)編程的基礎(chǔ)知識(shí)掌握TCP程序?qū)崿F(xiàn)方法掌握UDP程序的實(shí)現(xiàn)方法了解基于多線程的通信程序?qū)崿F(xiàn)方法會(huì)使用InetAddress類解決實(shí)際問(wèn)題會(huì)TCP網(wǎng)絡(luò)編程的步驟和技巧會(huì)編寫(xiě)多人聊天程序會(huì)多線程與網(wǎng)絡(luò)程序的結(jié)合應(yīng)用培養(yǎng)學(xué)生良好的道德規(guī)范和職業(yè)素養(yǎng)鼓勵(lì)學(xué)生奮發(fā)有為,敢于在短板弱項(xiàng)上下功夫任務(wù)9.1熟悉網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)任務(wù)9.1熟悉網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)計(jì)算機(jī)網(wǎng)絡(luò)是人們?nèi)粘I畹谋匦杵罚瑹o(wú)論是工作時(shí)發(fā)送郵件,還是在休閑時(shí)和朋友網(wǎng)絡(luò)聊天,都離不開(kāi)計(jì)算機(jī)網(wǎng)絡(luò)。計(jì)算機(jī)網(wǎng)絡(luò)形式多樣,內(nèi)容繁雜,網(wǎng)絡(luò)上的計(jì)算機(jī)要互相通信,必須遵守一定的網(wǎng)絡(luò)協(xié)議,目前使用最廣泛的網(wǎng)絡(luò)協(xié)議是TCP/IP協(xié)議。通過(guò)網(wǎng)絡(luò)編程能夠?qū)崿F(xiàn)網(wǎng)絡(luò)程序之間的通信互聯(lián),為人們的溝通交流帶來(lái)便利,本任務(wù)就是介紹網(wǎng)絡(luò)編程的相關(guān)知識(shí)。此外,一個(gè)商用程序項(xiàng)目往往是由多人合作完成,團(tuán)隊(duì)成員之間的協(xié)作溝通亦是至關(guān)重要,同學(xué)們要有團(tuán)隊(duì)合作意識(shí)和大局觀,要相互鼓勵(lì)、互幫互助,避免因信息不透明導(dǎo)致的項(xiàng)目延誤,共同提高團(tuán)隊(duì)的開(kāi)發(fā)效率。同時(shí),我們也要有強(qiáng)烈的上進(jìn)心,敢于挑戰(zhàn)工作中的難點(diǎn),突破技術(shù)瓶頸,從而提高自己的核心競(jìng)爭(zhēng)力?!救蝿?wù)導(dǎo)入】任務(wù)9.1熟悉網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)1.什么是TCP/IP協(xié)議?2.網(wǎng)絡(luò)數(shù)據(jù)傳輸時(shí)如何定位目標(biāo)地址?【思考】9.1.1TCP/IP概述TCP/IP也是目前因特網(wǎng)范圍內(nèi)使用的唯一一種協(xié)議。TCP/IP模型和OSI參考模型的對(duì)應(yīng)關(guān)系如表所示。一、TCP/IP模型TCP/IPOSI應(yīng)用層應(yīng)用層表示層會(huì)話層主機(jī)到主機(jī)層(TCP)(又稱傳輸層)傳輸層網(wǎng)絡(luò)層(IP)網(wǎng)絡(luò)層網(wǎng)絡(luò)接口層(又稱鏈路層)數(shù)據(jù)鏈9.1.1TCP/IP概述TCP/IP包括兩個(gè)協(xié)議,即傳輸控制協(xié)議(TransmissionControlProtocol,TCP)和因特網(wǎng)互聯(lián)協(xié)議(InternetProtocol,IP),但實(shí)際上TCP/IP是一系列協(xié)議的代名詞,包括上百種功能協(xié)議,如超文本傳輸協(xié)議(HTTP)、文件傳輸協(xié)議(FTP)、地址解析協(xié)議(ARP)等。TCP/IP協(xié)議共分為四個(gè)層次,分別是鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層,接下來(lái)詳細(xì)介紹各層的功能。鏈路層:又稱為網(wǎng)絡(luò)接口層,是TCP/IP協(xié)議族的最底層,負(fù)責(zé)監(jiān)視數(shù)據(jù)在主機(jī)和網(wǎng)絡(luò)之間的交換。實(shí)際上,TCP/IP模型并沒(méi)有定義該層的協(xié)議,而只是要求其能夠給網(wǎng)絡(luò)層提供一個(gè)訪問(wèn)接口,用于傳遞IP分組。9.1.1TCP/IP概述網(wǎng)絡(luò)層:是整個(gè)TCP/IP協(xié)議族的核心,主要功能把傳輸?shù)臄?shù)據(jù)進(jìn)行分組,并將分組數(shù)據(jù)發(fā)送到目標(biāo)網(wǎng)絡(luò)和主機(jī)。該層協(xié)議包括IP協(xié)議、ICMP(因特網(wǎng)控制報(bào)文協(xié)議)和IGMP(因特網(wǎng)組管理協(xié)議)。傳輸層:為兩臺(tái)主機(jī)上的網(wǎng)絡(luò)程序提供端到端的數(shù)據(jù)通信。程序可以選擇基于TCP協(xié)議來(lái)實(shí)現(xiàn),也可以采用UDP協(xié)議。應(yīng)用層:負(fù)責(zé)處理實(shí)際的應(yīng)用程序協(xié)議,主要包括FTP協(xié)議、SNMP(簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議)、HTTP協(xié)議等。9.1.1TCP/IP概述二、IP地址IP地址是進(jìn)行TCP/IP協(xié)議通信的基礎(chǔ),是對(duì)連接在因特網(wǎng)中的設(shè)備進(jìn)行唯一標(biāo)識(shí)的設(shè)備編碼。與日常生活中寄信時(shí)所用的郵件地址類似,以便設(shè)備之間能根據(jù)IP地址來(lái)識(shí)別。目前,IP地址是一個(gè)32位的二進(jìn)制數(shù),通常被分割為4個(gè)“8位二進(jìn)制數(shù)”(也就是4個(gè)字節(jié))。IP地址通常用“點(diǎn)分十進(jìn)制”表示成(a.b.c.d)的形式,其中a,b,c,d都是0~255之間的十進(jìn)制整數(shù)。點(diǎn)分十進(jìn)制IP地址(6),其對(duì)應(yīng)的32位二進(jìn)制數(shù)為(01111011.00111000.00001100.00010000)。例如9.1.1TCP/IP概述最初設(shè)計(jì)互聯(lián)網(wǎng)絡(luò)時(shí),為了便于尋址以及層次化構(gòu)造網(wǎng)絡(luò),每個(gè)IP地址包括兩個(gè)標(biāo)識(shí)碼(ID),即網(wǎng)絡(luò)ID和主機(jī)ID。同一個(gè)物理網(wǎng)絡(luò)上的所有主機(jī)都使用同一個(gè)網(wǎng)絡(luò)ID,網(wǎng)絡(luò)上的一個(gè)主機(jī)(包括網(wǎng)絡(luò)上工作站,服務(wù)器和路由器等)有一個(gè)主機(jī)ID與其對(duì)應(yīng)。Internet委員會(huì)定義了5種IP地址類型以適合不同容量的網(wǎng)絡(luò),即A類~E類。類別最大網(wǎng)絡(luò)數(shù)IP地址范圍單個(gè)網(wǎng)段最大主機(jī)數(shù)私有IP地址范圍A126(2^7-2)-5516777214-55B16384(2^14)-5565534-55C2097152(2^21)-55254-55D/-55//E/-54//IP地址的分類9.1.1TCP/IP概述A類地址的最高位必須是“0”,其第一個(gè)字節(jié)為網(wǎng)絡(luò)地址,后三個(gè)字節(jié)為主機(jī)地址。因此A類地址可擁有126個(gè)網(wǎng)絡(luò)地址數(shù),其中每個(gè)網(wǎng)絡(luò)最多可以包含的主機(jī)數(shù)目為224-2(主機(jī)地址全1和全0都屬于特殊地址),A類地址適用于超大規(guī)模的網(wǎng)絡(luò),其表示范圍為:~55。B類地址的最高兩位必須是“10”,前兩個(gè)字節(jié)為網(wǎng)絡(luò)地址,后兩個(gè)字節(jié)為主機(jī)地址。B類IP地址中網(wǎng)絡(luò)地址長(zhǎng)度為14位,有16384個(gè)網(wǎng)絡(luò),其中每個(gè)網(wǎng)絡(luò)最多可以包含的主機(jī)數(shù)目為216-2,B類地址適用于中等規(guī)模的網(wǎng)絡(luò),其表示范圍為:~55。1、A類地址2、B類地址9.1.1TCP/IP概述C類地址的最高三位必須是“110”,前三個(gè)字節(jié)為網(wǎng)絡(luò)地址,最后一個(gè)字節(jié)為主機(jī)地址。因此,C類地址的網(wǎng)絡(luò)數(shù)目為221。其中每個(gè)網(wǎng)絡(luò)可以包含的主機(jī)數(shù)目為28-2,C類地址適用于小規(guī)模的局域網(wǎng)絡(luò),其表示范圍為:~55。D類地址與前三類地址不同,它是一種特殊的IP地址類,應(yīng)用于多播通信,因此也被稱為多播地址。地址前面有4個(gè)引導(dǎo)位“1110”,其余的28位表示多播地址,其地址范圍為:-55。3、C類地址4、D類地址5、E類地址E類地址一般不用的實(shí)驗(yàn)性地址,前面包含4個(gè)引導(dǎo)位“1111”,其地址范圍為:---54。9.1.1TCP/IP概述特殊網(wǎng)址每一個(gè)字節(jié)都為0的地址,它并不是一個(gè)真實(shí)的IP地址,表示本機(jī)中所有的IPV4地址,地址是不能被ping通的abIP地址中的每一個(gè)字節(jié)都為1的IP地址55是當(dāng)前子網(wǎng)的廣播地址c回路地址,該地址指向本機(jī),一般用來(lái)測(cè)試使用,比如:ping用于測(cè)試本機(jī)的網(wǎng)絡(luò)是否正常。9.1.1TCP/IP概述三、端口號(hào)所謂的端口,就好像是門(mén)牌號(hào)一樣,郵遞員通過(guò)IP地址能夠找到客戶所在的大樓,但是一棟樓里面有很多個(gè)房間,那么再根據(jù)門(mén)牌號(hào)就能夠準(zhǔn)確找到客戶。同理,在計(jì)算機(jī)網(wǎng)絡(luò)中客戶端和服務(wù)器端進(jìn)行通信時(shí),客戶端可以通過(guò)ip地址找到對(duì)應(yīng)的服務(wù)器端,但是服務(wù)器端有多個(gè)端口,每個(gè)應(yīng)用程序?qū)?yīng)一個(gè)端口號(hào),通過(guò)類似門(mén)牌號(hào)的端口號(hào),客戶端才能真正訪問(wèn)服務(wù)器端上指定端口對(duì)應(yīng)的應(yīng)用程序。9.1.1TCP/IP概述三、端口號(hào)TCP/IP端口號(hào)的分配綜合了以上兩種方式。需要注意的是,同一臺(tái)機(jī)器上不能有兩個(gè)采用相同網(wǎng)絡(luò)協(xié)議的程序使用同一個(gè)端口,例如一臺(tái)機(jī)器上某個(gè)程序使用了TCP協(xié)議的2182端口號(hào),那么這個(gè)端口號(hào)就不能再被其它采用TCP協(xié)議的應(yīng)用程序使用。9.1.1TCP/IP概述端口號(hào)的范圍是0~65535,通常將它分為三類:端口號(hào)為49152~65535,理論上不應(yīng)該把常用服務(wù)分配在這些端口上,但實(shí)際上有些較為特殊的程序,特別是一些木馬就非常喜歡使用這些端口,因?yàn)檫@些端口常常不會(huì)引起人們的注意,容易隱蔽。端口號(hào)為0~1023,它們綁定于一些特殊的服務(wù)。通常,這些端口的通信明確地表明了某種服務(wù)協(xié)議,不可再重新定義它的作用對(duì)象。例如21端口分配給FTP服務(wù),23號(hào)端口分配給Telnet服務(wù)專用,25號(hào)端口分配全SMTP服務(wù),80端口是HTTP通信使用的,135端口分配給RPC服務(wù)等。端口號(hào)為1024~49151,它們松散地綁定些服務(wù),即有許多服務(wù)綁定于這些端口,這些端口同樣用于許多其他目的,且多數(shù)沒(méi)有明確定義對(duì)象,不同的程序可以根據(jù)需要自己定義。公認(rèn)端口:注冊(cè)端口:動(dòng)態(tài)/私有端口:9.1.1TCP/IP概述四、套接字在TCP/IP協(xié)議中,網(wǎng)絡(luò)層的IP地址可以唯一標(biāo)識(shí)網(wǎng)絡(luò)中的主機(jī),而傳輸層的“協(xié)議+端口”可以唯一標(biāo)識(shí)主機(jī)中的應(yīng)用程序(進(jìn)程)。利用這三個(gè)元素(IP地址、協(xié)議、端口)構(gòu)成套接字(Socket),就可以標(biāo)識(shí)網(wǎng)絡(luò)的通信進(jìn)程。套接字是通信的基石,是支持TCP/IP協(xié)議的基本操作單元??梢詫⑻捉幼挚醋鞑煌鳈C(jī)間的進(jìn)程進(jìn)行雙向通信的端點(diǎn)。對(duì)應(yīng)一個(gè)特定的連接,每個(gè)通信實(shí)體都有一個(gè)套接字,通過(guò)套接字,兩個(gè)通信實(shí)體之間就形成了一條“虛擬”通道。9.1.1TCP/IP概述TCP/IP協(xié)議中為了使兩個(gè)主機(jī)節(jié)點(diǎn)間建立聯(lián)系,進(jìn)行數(shù)據(jù)交換服務(wù),通常采用的編程模式為客戶端/服務(wù)器模式(Client/Server,C/S)。在進(jìn)行C/S模型編程時(shí)至少需要一對(duì)套接字,其中一個(gè)運(yùn)行在客戶端,另一個(gè)運(yùn)行在服務(wù)器上。當(dāng)創(chuàng)建了這對(duì)套接字后,就可以實(shí)現(xiàn)數(shù)據(jù)傳輸了。套接字之間的具體連接過(guò)程為:服務(wù)器監(jiān)聽(tīng):創(chuàng)建套接字,設(shè)置網(wǎng)絡(luò)傳輸協(xié)議(TCP協(xié)議或者UDP協(xié)議),在指定的IP地址和端口上等待客戶端的請(qǐng)求,實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)。12客戶端請(qǐng)求:由客戶端的套接字發(fā)出連接請(qǐng)求,請(qǐng)求的目標(biāo)為服務(wù)器的套接字,因此需要設(shè)置指向的服務(wù)器套接字的IP地址和端口號(hào)。3連接確認(rèn):當(dāng)服務(wù)器套接字監(jiān)聽(tīng)到客戶端套接字的請(qǐng)求時(shí),立即響應(yīng)客戶端的請(qǐng)求,把服務(wù)器套接字的描述發(fā)回客戶端,一旦客戶端確認(rèn)了此描述信息,那么雙方的通信鏈路就成功建立。9.1.2InetAddress一、創(chuàng)建InetAddress對(duì)象根據(jù)域名創(chuàng)建InetAddress對(duì)象InetAddressaddr1=InetAddress.getByName("");14獲取本機(jī)的InetAddress對(duì)象InetAddressaddr4=InetAddress.getLocalHost();3根據(jù)主機(jī)名創(chuàng)建InetAddress對(duì)象InetAddressaddr3=InetAddress.getByName("master");2根據(jù)ip創(chuàng)建InetAddress對(duì)象InetAddressaddr2=InetAddress.getByName("44");9.1.2InetAddress一、創(chuàng)建InetAddress對(duì)象根據(jù)ip字節(jié)數(shù)組創(chuàng)建InetAddress對(duì)象byteip[]=newbyte[]{(byte)141,(byte)146,8,66};InetAddressaddr5=InetAddress.getByAddress(ip);57獲取該主機(jī)的所有地址,返回一個(gè)InetAddress[]對(duì)象InetAddress[]addr=InetAddress.getAllByName("");for(InetAddressinetAddress:addr){System.out.println(inetAddress);}6根據(jù)域名和ip字節(jié)數(shù)組創(chuàng)建InetAddress對(duì)象InetAddressaddr6=InetAddress.getByAddress("master",ip);9.1.2InetAddress二、InetAddress類常用方法publicStringgetHostName()獲取此IP地址的主機(jī)名。如果此InetAddress是用主機(jī)名創(chuàng)建的,則記憶并返回主機(jī)名;否則,將執(zhí)行反向名稱查找并基于系統(tǒng)配置的名稱查找服務(wù)返回結(jié)果。返回此IP地址的主機(jī)名;如果安全檢查不允許操作,則返回IP地址的文本表示形式。13publicStringgetHostAddress()返回該InetAddress實(shí)例對(duì)應(yīng)的IP地址字符串(以字符串形式)。2publicStringgetCanonicalHostName()該方法和getHostName方法一樣,也是得到遠(yuǎn)程主機(jī)的域名。區(qū)別是,該方法得到的是主機(jī)名,getHostName得到的是主機(jī)別名。9.1.2InetAddress二、InetAddress類常用方法publicbyte[]getAddress()該方法也是返回InetAddress實(shí)例對(duì)應(yīng)的IP地址,和getHostAddress方法唯一區(qū)別是,getHostAddress返回字符形式的IP地址,getAddress返回byte數(shù)組形式的IP地址。45publicbooleanisReachable(inttimeout)可以根據(jù)指定timeout時(shí)間內(nèi)測(cè)試網(wǎng)絡(luò)是否可達(dá),是否可以建立連接。試一試?yán)?.1InetAddress方法的使用。獲得網(wǎng)址對(duì)應(yīng)的InetAddress對(duì)象InetAddress

remoteAddress=InetAddress.getByName("")獲得該網(wǎng)站的IP地址StringremoteIP=remoteAddress.getHostAddress();System.out.println("的IP地址為:"+remoteIP);獲得其對(duì)應(yīng)的主機(jī)名StringremoteHost=remoteAddress.getHostName();System.out.println("的主機(jī)名為:"+remoteHost);測(cè)試在1500毫秒內(nèi)能發(fā)訪問(wèn)到該網(wǎng)站的IP地址booleanflag=remoteAddress.isReachable(1500);Stringstr=flag?"能夠":"不能";System.out.println("1.5秒"+str+"到達(dá)該地址");試一試?yán)?.1InetAddress方法的使用。獲得本機(jī)對(duì)應(yīng)的InetAddress對(duì)象InetAddresslocalAddress=InetAddress.getLocalHost();獲得本機(jī)的IP地址StringlocalIP=localAddress.getHostAddress();System.out.println("本機(jī)IP地址:"+localIP);獲得本機(jī)的主機(jī)名StringlocalHost=localAddress.getHostName();System.out.println("本機(jī)的主機(jī)名為:"+localHost);獲得本機(jī)對(duì)應(yīng)的全限定域名StringlocalDNS=localAddress.getCanonicalHostName();System.out.println("本機(jī)對(duì)應(yīng)的全限定域名:"+localDNS);任務(wù)9.2Java中的TCP編程任務(wù)9.1熟悉網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)在實(shí)際工作中,不能夠只求程序能夠運(yùn)行,知其然而不知其所以然,我們要有不斷鉆研的職業(yè)素養(yǎng),對(duì)自己負(fù)責(zé)的事情要有端正的態(tài)度,認(rèn)真負(fù)責(zé)的職業(yè)操守。在網(wǎng)絡(luò)編程時(shí),對(duì)不同的網(wǎng)絡(luò)協(xié)議特性要有清晰的認(rèn)識(shí),以便能夠根據(jù)應(yīng)用場(chǎng)景的不同選擇合適的網(wǎng)絡(luò)協(xié)議,這是成長(zhǎng)為技術(shù)專家必須具備的素質(zhì)。在TCP/IP協(xié)議族的傳輸層中有兩個(gè)重要的高級(jí)協(xié)議,分別是TCP協(xié)議和UDP協(xié)議,其中TCP為傳輸控制協(xié)議(TransmissionControlProtocol),UDP是用戶數(shù)據(jù)報(bào)協(xié)議(UserDatagramProtocol)。那么它們各自具有什么特點(diǎn)?【任務(wù)導(dǎo)入】思考1.TCP協(xié)議有哪些特點(diǎn)?2.如何實(shí)現(xiàn)基于TCP協(xié)議的網(wǎng)絡(luò)程序?9.2.1TCP協(xié)議其主要特點(diǎn)有:通過(guò)“3次握手”建立面向連接的服務(wù),兩臺(tái)計(jì)算機(jī)使用TCP協(xié)議進(jìn)行數(shù)據(jù)傳輸之前,必須建立TCP連接。在TCP連接中必須要明確客戶端與服務(wù)器端,且由客戶端向服務(wù)器端發(fā)出連接請(qǐng)求,每次連接的創(chuàng)建都需要經(jīng)過(guò)“3次握手”。13獲取該主機(jī)的所有地址,返回一個(gè)InetAddress[]對(duì)象InetAddress[]addr=InetAddress.getAllByName("");for(InetAddressinetAddress:addr){System.out.println(inetAddress);}2提供雙向數(shù)據(jù)通信傳輸服務(wù),只要客戶端與服務(wù)器端建立了TCP連接,那么雙方就能實(shí)現(xiàn)端對(duì)端的雙向數(shù)據(jù)傳輸。TCP協(xié)議提供一種面向連接的、可靠的數(shù)據(jù)傳輸服務(wù),能有效保證端到端的數(shù)據(jù)傳輸可靠性。9.2.1TCP協(xié)議基于TCP的以上特點(diǎn),我們可以得知TCP協(xié)議的主要使用場(chǎng)景。由于采用“3次握手”方式提供可靠的數(shù)據(jù)傳輸,因此犧牲了它的即時(shí)性。該協(xié)議不適合對(duì)實(shí)時(shí)性要求比較高的應(yīng)用場(chǎng)景,而比較適合對(duì)穩(wěn)定性和傳輸精確度要求較高的應(yīng)用場(chǎng)景,比如文字聊天、文件傳輸?shù)裙δ?。TCP協(xié)議控制兩個(gè)通信實(shí)體互相通信的過(guò)程,如下圖所示。兩個(gè)實(shí)體通信過(guò)程9.2.2ServerSocket類創(chuàng)建TCP服務(wù)器端一、構(gòu)造方法ServerSocket():默認(rèn)的構(gòu)造方法,通過(guò)該方法構(gòu)造的ServerSocket對(duì)象不與任何端口綁定,需要使用bind(SocketAddressport)方法與特定端口進(jìn)行綁定。14ServerSocket(intport,intbacklog,InetAddresslocalAddr):在機(jī)器存在多個(gè)IP地址的情況下,允許通過(guò)localAddr這個(gè)參數(shù)來(lái)指定將ServerSocket綁定到指定的IP地址。3ServerSocket(intport,intbacklog):backlog參數(shù)用來(lái)顯示設(shè)置連接請(qǐng)求隊(duì)列長(zhǎng)度。2ServerSocket(intport):用指定的端口port來(lái)創(chuàng)建一個(gè)ServerSocket。該端口應(yīng)該是一個(gè)有效的端口整數(shù)值:0~65535,服務(wù)端程序會(huì)監(jiān)聽(tīng)該端口上的數(shù)據(jù)。9.2.2ServerSocket類創(chuàng)建TCP服務(wù)器端二、常用方法InetAddressgetInetAddress():該方法返回一個(gè)InetAddress對(duì)象,該對(duì)象中封裝了ServerSocket綁定的IP地址。14voidclose():該方法使服務(wù)器釋放占用的端口,并且斷開(kāi)與所有客戶的連接。3Socketaccept():該方法從連接請(qǐng)求隊(duì)列中取出一個(gè)客戶的連接請(qǐng)求,然后創(chuàng)建與客戶連接的Socket對(duì)象,并將它返回。如果隊(duì)列中沒(méi)有連接請(qǐng)求,accept()方法就會(huì)一直等待,直到接收到了連接請(qǐng)求才返回。2voidbind(SocketAddresspoint):該方法用于將ServerSocket對(duì)象綁定到指定的IP地址和端口號(hào),其中point對(duì)象里面封裝了需要的IP地址和端口號(hào)。9.2.2ServerSocket類創(chuàng)建TCP服務(wù)器端實(shí)現(xiàn)服務(wù)器端程序:創(chuàng)建ServerSocket套接字對(duì)象。1將該套接字綁定到本地IP地址和端口號(hào)。2將套接字開(kāi)啟監(jiān)聽(tīng)模式,等待客戶端的連接請(qǐng)求。3有連接到來(lái),返回一個(gè)新的套接字。4基于該通信套接字創(chuàng)建輸入、輸出流。5通過(guò)輸入、輸出流進(jìn)行數(shù)據(jù)的接收和發(fā)送。6會(huì)話結(jié)束,關(guān)閉IO流和通信套接字。7不斷重復(fù)3-7步的操作。8程序退出直接關(guān)閉ServerSocket套接字對(duì)象。9//創(chuàng)建ServerSocket套接字對(duì)象,并綁定指定的端口號(hào)ServerSocketserverSocket=newServerSocket(PORT);while(true){//啟動(dòng)循環(huán),重復(fù)對(duì)客戶端的監(jiān)聽(tīng)、通信等操作try{//開(kāi)啟監(jiān)聽(tīng)模式,等待客戶端的連接請(qǐng)求,并用client對(duì)象保存已經(jīng)連接的客戶端套接字Socketclient=serverSocket.accept();//獲得與客戶端通信的輸入、輸出字節(jié)流對(duì)象InputStreaminput=client.getInputStream();OutputStreamoutput=client.getOutputStream();}catch(Exceptione){System.out.println("clientexception,e="+e.getMessage());}}9.2.2ServerSocket類創(chuàng)建TCP服務(wù)器端根據(jù)上面的實(shí)現(xiàn)思路,我們?cè)O(shè)計(jì)了服務(wù)器端程序的主要框架代碼:9.2.3Socket類實(shí)現(xiàn)TCP客戶端一、構(gòu)造方法Socket():默認(rèn)構(gòu)造函數(shù),沒(méi)有指定IP地址和端口號(hào),意味著該套接字對(duì)象沒(méi)有去連接任何服務(wù)器。對(duì)象創(chuàng)建后還得使用connect(SocketAddressendpoint,inttimeout)方法與特定端口進(jìn)行綁定,例如:Socketsocket=newSocket();SocketAddressremoteAddr=newInetSocketAddress("localhost",8000);socket.connect(remoteAddr,60000);//連接服務(wù)器并設(shè)置連接超時(shí)時(shí)間為1分鐘1Socket(InetAddress/StringremoteAddress,intport):創(chuàng)建一個(gè)套接字并將其連接到指定IP地址上的指定端口號(hào),例如:Socketsocket=newSocket("localhost",3500);2Socket(InetAddress/StringremoteAddress,intport,InetAddresslocalAddr,intlocalPort):創(chuàng)建連接到指定遠(yuǎn)程主機(jī)、遠(yuǎn)程端口的Socket,并指定本地IP地址和本地端口號(hào),適用于本地主機(jī)有多個(gè)IP地址的情形。例如:Socketsocket=newSocket("2",3600,"localhost",3500);39.2.3Socket類實(shí)現(xiàn)TCP客戶端二、客戶端連接服務(wù)器的異常類UnknownHostException:如果無(wú)法識(shí)別主機(jī)的名字或IP地址,就會(huì)拋出此種異常。1ConnectException:如果沒(méi)有服務(wù)器進(jìn)程監(jiān)聽(tīng)指定的端口,或者服務(wù)器進(jìn)程拒絕連接,就會(huì)拋出這種異常。2SocketTimeoutException:如果等待連接超時(shí),就會(huì)拋出這種異常。3BindException:如果無(wú)法把Socket對(duì)象與指定的本地IP地址或端口綁定,就會(huì)拋出這種異常。49.2.3Socket類實(shí)現(xiàn)TCP客戶端三、常用方法publicInetAddressgetInetAddress()獲得連接的遠(yuǎn)程服務(wù)器的IP地址。1publicSocketAddressgetRemoteSocketAddress()獲取連接的遠(yuǎn)程服務(wù)器地址。2publicSocketAddressgetLocalSocketAddress()獲取本地綁定的地址。3publicintgetPort()獲得遠(yuǎn)程服務(wù)器的端口。4Socket類中提供了一系列與套接字通信相關(guān)的方法。9.2.3Socket類實(shí)現(xiàn)TCP客戶端三、常用方法publicInetAddressgetLocalAddress()獲得客戶端本地的IP地址。5InputStreamgetInputStream()返回該Socket對(duì)象對(duì)應(yīng)的輸入流,讓程序通過(guò)該輸入流從Socket中取出數(shù)據(jù)。6OutputStreamgetOutputStream()返回該Socket對(duì)象對(duì)應(yīng)的輸出流,讓程序通過(guò)該輸出流向Socket中輸出數(shù)據(jù)。7voidclose()關(guān)閉套接字。當(dāng)客戶端與服務(wù)器的通信結(jié)束,應(yīng)該及時(shí)關(guān)閉Socket,以釋放Socket占用的包括端口在內(nèi)的各種資源。當(dāng)一個(gè)Socket對(duì)象被關(guān)閉,就不能再通過(guò)它的輸入輸出流進(jìn)行I/O操作,否則會(huì)導(dǎo)致IOException。8Socket類中提供了一系列與套接字通信相關(guān)的方法。9.2.3Socket類實(shí)現(xiàn)TCP客戶端Socket類實(shí)現(xiàn)的客戶端程序思路:創(chuàng)建Socket對(duì)象的套接字。1向指定的服務(wù)器地址和端口發(fā)出連接請(qǐng)求。2基于該套接字創(chuàng)建讀和寫(xiě)的流。3利用IO流與服務(wù)器端進(jìn)行通信。4關(guān)閉IO流5關(guān)閉套接字對(duì)象69.2.4簡(jiǎn)單的TCP網(wǎng)絡(luò)程序通過(guò)ServerSocket類和Socket類分別實(shí)現(xiàn)服務(wù)器端程序和客戶端程序,完成一個(gè)簡(jiǎn)單的聊天通信程序。為保證數(shù)據(jù)傳輸?shù)陌踩裕紫葘?shí)現(xiàn)服務(wù)器程序。服務(wù)器端通過(guò)while循環(huán)不斷接受客戶端的連接請(qǐng)求,每次有請(qǐng)求到來(lái)即生成一個(gè)新的套接字用于與客戶端的通信。而與客戶端進(jìn)行數(shù)據(jù)傳輸,是通過(guò)與套接字關(guān)聯(lián)的輸入、輸出流對(duì)象實(shí)現(xiàn)的。即用conn.getInputStream()返回的輸入流對(duì)象接收客戶端發(fā)來(lái)的消息,用conn.getOutputStream()返回的輸出流對(duì)象對(duì)客戶端發(fā)送消息。通過(guò)套接字的getRemoteSocketAddress()方法能夠返回一個(gè)SocketAddress對(duì)象,該對(duì)象描述與服務(wù)器端通信的客戶端的IP地址和端口號(hào)信息。9.2.4簡(jiǎn)單的TCP網(wǎng)絡(luò)程序另外,上述代碼中利用套接字的輸入流(InputStream)對(duì)象input,使用read方法接收客戶端發(fā)送的消息,該方法是以阻塞形式調(diào)用的,即只有收到客戶端發(fā)來(lái)的消息,該方法才返回;若沒(méi)有消息到來(lái),那么該方法一直停在那里等客戶端消息,這樣整個(gè)程序就不會(huì)繼續(xù)往下運(yùn)行。只有當(dāng)與一個(gè)客戶端的通信完成后,才能繼續(xù)下一次循環(huán),重復(fù)接受另一個(gè)客戶端的請(qǐng)求。因此,該服務(wù)器程序不能同時(shí)與多個(gè)客戶端進(jìn)行通信。在完成了服務(wù)器端程序的編寫(xiě)后,接下來(lái)實(shí)現(xiàn)客戶端程序。客戶端程序相對(duì)服務(wù)器端更簡(jiǎn)單,首先創(chuàng)建Socket對(duì)象套接字,需要設(shè)置服務(wù)器端監(jiān)聽(tīng)的IP地址和端口號(hào),用于連接服務(wù)器。當(dāng)連接上服務(wù)器后,利用套接字的輸入、輸出流對(duì)象與服務(wù)器端進(jìn)行消息的讀取和發(fā)送。9.2.4簡(jiǎn)單的TCP網(wǎng)絡(luò)程序例9.2完成基于TCP協(xié)議的文件傳輸程序,將本地目錄中C盤(pán)上的一張test.jpg圖片通過(guò)網(wǎng)絡(luò)程序傳輸?shù)紻盤(pán)。程序分析服務(wù)器端中創(chuàng)建ServerSocket對(duì)象,并開(kāi)啟監(jiān)聽(tīng)接受客戶端的連接請(qǐng)求,連接建立好后,通過(guò)套接字的輸入流來(lái)讀取客戶端發(fā)送過(guò)來(lái)的內(nèi)容。由于傳輸?shù)奈募容^大,一般不能夠?qū)⑽募?nèi)容一次性發(fā)送到服務(wù)器,因此服務(wù)器端和客戶端約定,每次用一個(gè)長(zhǎng)度為1024的字節(jié)數(shù)組接收客戶端發(fā)送來(lái)的消息。并將收到的字節(jié)數(shù)組內(nèi)容通過(guò)本地文件輸出流,寫(xiě)到目標(biāo)文件中。服務(wù)器從客戶端讀取內(nèi)容和寫(xiě)內(nèi)容到本地文件是同步的,即每次從客戶端收到若干字節(jié)內(nèi)容,就將該內(nèi)容立即寫(xiě)入本地文件。接下來(lái)是客戶端程序功能實(shí)現(xiàn),客戶端創(chuàng)建Socket對(duì)象與服務(wù)器建立通信連接,并利用套接字的輸出流往服務(wù)器發(fā)送消息。9.2.5基于多線程的通信聊天程序上一節(jié)的簡(jiǎn)單TCP網(wǎng)絡(luò)程序?qū)崿F(xiàn)了服務(wù)器與客戶端之間的通信,但是由于使用了IO流的阻塞讀取方法,服務(wù)器端程序會(huì)阻塞在讀取消息的方法那里,直到有客戶端消息到來(lái)才能繼續(xù)處理下一個(gè)客戶端的連接請(qǐng)求,因此服務(wù)器不能同時(shí)與多個(gè)客戶端進(jìn)行通信。而實(shí)際應(yīng)用中的C/S程序,服務(wù)器能夠同時(shí)與多個(gè)客戶端進(jìn)行交互。為了實(shí)現(xiàn)多人聊天室的功能,需要對(duì)原有服務(wù)端代碼進(jìn)行改造,引入多線程,將監(jiān)聽(tīng)客戶端的連接請(qǐng)求和與客戶端進(jìn)行讀寫(xiě)的操作分離,分布在不同的線程中實(shí)現(xiàn)。9.2.5基于多線程的通信聊天程序//創(chuàng)建一個(gè)ServerSocket,用于監(jiān)聽(tīng)客戶端Socket的連接請(qǐng)求ServerSocketss=newServerSocket(30000);//采用循環(huán)不斷接受來(lái)自客戶端的請(qǐng)求while(true){ //每當(dāng)接受到客戶端Socket的請(qǐng)求,服務(wù)器端也對(duì)應(yīng)產(chǎn)生一個(gè)Socket Sockets=ss.accept();//將與客戶端通信的套接字傳入一個(gè)新創(chuàng)建的線程中ServerThreadth=newServerThread(s);//開(kāi)啟線程,專門(mén)負(fù)責(zé)與對(duì)應(yīng)客戶端的通信th.start();}加入多線程后的代碼片段為:任務(wù)9.3Java中的UDP編程任務(wù)9.3Java中的UDP編程UDP協(xié)議和TCP協(xié)議一樣,都是非常重要的網(wǎng)絡(luò)傳輸層協(xié)議,但是在實(shí)際工作中,這兩種協(xié)議的應(yīng)用場(chǎng)景不太一樣,接下來(lái)使用UDP協(xié)議來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)通信程序?!救蝿?wù)導(dǎo)入】【思考】1、UDP協(xié)議有哪些特點(diǎn)?2、UDP協(xié)議和TCP協(xié)議的區(qū)別是什么?3、如何實(shí)現(xiàn)基于UDP協(xié)議的網(wǎng)絡(luò)程序?9.3.1UDP協(xié)議UDP協(xié)議是一個(gè)無(wú)連接的通信協(xié)議,也就是說(shuō)在傳輸數(shù)據(jù)之前,發(fā)送端和接收端之間不需要建立通信連接。發(fā)送端有數(shù)據(jù)發(fā)送時(shí),它不會(huì)去確認(rèn)目的接收端是否存在,而接收端在收到數(shù)據(jù)后也不會(huì)給發(fā)送端一個(gè)確認(rèn)的反饋。由于UDP提供不可靠服務(wù),具有TCP所沒(méi)有的優(yōu)勢(shì),其主要特點(diǎn)有:UDP無(wú)連接,時(shí)間上不存在建立連接需要的時(shí)延??臻g上,TCP需要在端系統(tǒng)中維護(hù)連接狀態(tài),需要一定的開(kāi)銷,此連接裝入包括接收和發(fā)送緩存、擁塞控制參數(shù)。UDP不維護(hù)連接狀態(tài),也不跟蹤這些參數(shù),開(kāi)銷小。空間和時(shí)間上都具有優(yōu)勢(shì)。1UDP沒(méi)有擁塞控制,應(yīng)用層能夠更好的控制要發(fā)送的數(shù)據(jù)和發(fā)送時(shí)間,網(wǎng)絡(luò)中的擁塞控制也不會(huì)影響主機(jī)的發(fā)送速率。2DP提供盡最大努力的交付,但不保證可靠交付。所有維護(hù)傳輸可靠性的工作需要用戶在應(yīng)用層來(lái)完成。沒(méi)有TCP的確認(rèn)機(jī)制、重傳機(jī)制。如果因?yàn)榫W(wǎng)絡(luò)原因沒(méi)有傳送到對(duì)端,UDP也不會(huì)給應(yīng)用層返回錯(cuò)誤信息。3UDP是面向報(bào)文的,對(duì)應(yīng)用層交下來(lái)的報(bào)文,添加首部后直接向下交付給IP層,既不合并,也不拆分,保留這些報(bào)文的邊界。4正因?yàn)閁DP的這些特性,使得UDP適用于一次性傳輸少量數(shù)據(jù)、能夠容忍一些數(shù)據(jù)丟失、但不能允許有較大延時(shí)的網(wǎng)絡(luò)應(yīng)用。比如音頻、視頻數(shù)據(jù)的傳輸?shù)取?.3.1UDP協(xié)議UDP協(xié)議的程序分為發(fā)送端和接收端,下面分別看發(fā)、收兩端的運(yùn)行流程。發(fā)送端數(shù)據(jù)流程:創(chuàng)建發(fā)送端socket對(duì)象;1準(zhǔn)備要發(fā)送的數(shù)據(jù),字節(jié)數(shù)組;2將數(shù)據(jù)封裝到數(shù)據(jù)包中,并指定目的地IP地址和端口;3通過(guò)socket服務(wù)的發(fā)送功能,將數(shù)據(jù)包發(fā)出去;4釋放資源;59.3.1UDP協(xié)議接收端數(shù)據(jù)流程:創(chuàng)建接收端socket對(duì)象;1準(zhǔn)備接收容器,字節(jié)數(shù)組;2把接收容器封裝成數(shù)據(jù)包;3接收數(shù)據(jù);4解析數(shù)據(jù);5釋放資源;69.3.2DatagramSocket類一、構(gòu)造方法DatagramSocket()構(gòu)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到本地主機(jī)默認(rèn)IP地址和任何可用的端口1DatagramSocket(intport)構(gòu)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到本地主機(jī)的默認(rèn)IP地址和指定端口2DatagramSocket(intport,InetAddressladdr)創(chuàng)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到指定的本地地址和端口3DatagramSocket(SocketAddressbindaddr)創(chuàng)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到指定的本地套接字地址49.3.2DatagramSocket類二、常用方法InetAddressgetInetAddress()返回此套接字連接的地址1InetAddressgetLocalAddress()獲取綁定的套接字的本地地址2intgetLocalPort()返回此套接字綁定的本地主機(jī)上的端口號(hào)3SocketAddressgetLocalSocketAddress()返回此套接字綁定到的端點(diǎn)的地址4DatagramSocket類封裝了一些方法進(jìn)行數(shù)據(jù)包的收發(fā),并獲取數(shù)據(jù)傳輸中的通信信息,常用的成員方法有:intgetPort()返回此套接字連接的端口號(hào)5voidclose()關(guān)閉該數(shù)據(jù)報(bào)套接字69.3.2DatagramSocket類二、常用方法voidconnect(InetAddressaddress,intport)將套接字連接到這個(gè)套接字的遠(yuǎn)程地址7voidbind(SocketAddressaddr)結(jié)合這個(gè)DatagramSocket到特定的地址和端口8SocketAddressgetRemoteSocketAddress()返回此套接字連接的端點(diǎn)的地址。9voidreceive(DatagramPacketp)將接收到的數(shù)據(jù)填充到DatagramPacket數(shù)據(jù)包中。該方法為阻塞調(diào)用,只有當(dāng)收到數(shù)據(jù)包時(shí)才返回。DatagramSocket類封裝了一些方法進(jìn)行數(shù)據(jù)包的收發(fā),并獲取數(shù)據(jù)傳輸中的通信信息,常用的成員方法有:voidsend(DatagramPacketp)發(fā)送DatagramPacket數(shù)據(jù)包,該數(shù)據(jù)包中包含目的主機(jī)IP和端口號(hào)。1011接收數(shù)據(jù)報(bào)的構(gòu)造函數(shù):publicDatagramPacket(bytebuf[],intlength)publicDatagramPacket(bytebuf[],intoffset,intlength)9.3.3DatagramPacket類一、DatagramPacket類的構(gòu)造函數(shù)根據(jù)功能定位的不同,我們將DatagramPacket類構(gòu)造方法分成了發(fā)送數(shù)據(jù)報(bào)和接收數(shù)據(jù)報(bào)這兩類。第一個(gè)構(gòu)造函數(shù):當(dāng)Socket接收一個(gè)數(shù)據(jù)報(bào)時(shí),它將數(shù)據(jù)報(bào)的數(shù)據(jù)部分存儲(chǔ)在buf字節(jié)數(shù)組中,從buf[0]開(kāi)始一直到包完全存儲(chǔ),或者直到向字節(jié)數(shù)組中寫(xiě)入了length個(gè)字節(jié)為止。第二個(gè)構(gòu)造函數(shù):將從buf[offset]開(kāi)始存儲(chǔ),直到包完全存儲(chǔ),或者直到向字節(jié)數(shù)組中寫(xiě)入了length個(gè)字節(jié)為止。byte[]buf=newbyte[1024];DatagramPacketpacket1=newDatagramPacket(buf,buf.length);DatagramPacketpacket2=newDatagramPacket(buf,0,buf.length);9.3.3DatagramPacket類例如:publicDatagramPacket(bytebuf[],intlength,SocketAddressaddress)publicDatagramPacket(bytebuf[],intoffset,intlength,SocketAddressaddress)publicDatagramPacket(bytebuf[],intlength,InetAddressaddress,intport)publicDatagramPacket(bytebuf[],intoffset,intlength,InetAddressaddress,intport)發(fā)送數(shù)據(jù)報(bào)的構(gòu)造函數(shù):這四個(gè)構(gòu)造函數(shù)可以創(chuàng)建新的DatagramPacket對(duì)象并從網(wǎng)絡(luò)發(fā)送數(shù)據(jù),與接收數(shù)據(jù)報(bào)構(gòu)造函數(shù)區(qū)別在于指定了目標(biāo)主機(jī)地址和端口信息。9.3.3DatagramPacket類例如://準(zhǔn)備要發(fā)送的數(shù)據(jù)Stringstr="helloworld";//轉(zhuǎn)化為byte字節(jié)數(shù)組byte[]buf=str.getBytes("UTF-8");//構(gòu)造發(fā)送的目標(biāo)地址和端口InetAddressaddress=InetAddress.getByName("localhost");intport=3800;//構(gòu)造DatagramPacketDatagramPacketpacket=newDatagramPacket(buf,buf.length,address,port);9.3.3DatagramPacket類二、DatagramPacket類的常用方法publicInetAddressgetAddress()返回某臺(tái)機(jī)器的IP地址,此數(shù)據(jù)報(bào)將要發(fā)往該機(jī)器或者是從該機(jī)器接收到的。1publicintgetPort()返回某臺(tái)遠(yuǎn)程主機(jī)的端口號(hào),此數(shù)據(jù)報(bào)將要發(fā)往該主機(jī)或者是從該主機(jī)接收到的。2publicSocketAddressgetSocketAddress()獲取要將此包發(fā)送到的或發(fā)出此數(shù)據(jù)報(bào)的遠(yuǎn)程主機(jī)的SocketAddress(通常為IP地址+端口號(hào))。3publicintgetLength()返回將要發(fā)送或接收到的數(shù)據(jù)的長(zhǎng)度。49.3.3DatagramPacket類二、DatagramPacket類的常用方法publicvoidsetAddress(InetAddressiaddr)設(shè)置要將此數(shù)據(jù)報(bào)發(fā)往的那臺(tái)機(jī)器的IP地址。5publicvoidsetPort(intiport)設(shè)置要將此數(shù)據(jù)報(bào)發(fā)往的遠(yuǎn)程主機(jī)上的端口號(hào)。6publicvoidsetSocketAddress(SocketAddressaddress)設(shè)置要將此數(shù)據(jù)報(bào)發(fā)往的遠(yuǎn)程主機(jī)的SocketAddress(通常為IP地址+端口號(hào))。79.3.3DatagramPacket類數(shù)據(jù)報(bào)的發(fā)送部分代碼:創(chuàng)建發(fā)送端套接字對(duì)象+端口DatagramSocketclient=newDatagramSocket(8888);1準(zhǔn)備要發(fā)送的數(shù)據(jù),字節(jié)數(shù)組Stringmsg="UDP編程";byte[]data=msg.getBytes("utf-8");2給數(shù)據(jù)打包,并指定發(fā)送的目的地和端口DatagramPacket(bytebuf[],intlength,InetAddressaddress,intport)InetAddressaddress=InetAddress.getByName("");DatagramPacketpacket=newD

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論