基于TCP、UDP的聊天文件傳輸程序_第1頁
基于TCP、UDP的聊天文件傳輸程序_第2頁
基于TCP、UDP的聊天文件傳輸程序_第3頁
基于TCP、UDP的聊天文件傳輸程序_第4頁
基于TCP、UDP的聊天文件傳輸程序_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

網(wǎng)絡(luò)通信原理課程題目基于TCP、UDP的聊天文件傳輸程序目錄1實(shí)驗(yàn)綜述 實(shí)驗(yàn)綜述1.1設(shè)計(jì)目標(biāo)TCP/IP協(xié)議是Internet的基礎(chǔ)和最基本的網(wǎng)絡(luò)協(xié)議。本實(shí)驗(yàn)利用了UDP和TCP協(xié)議,實(shí)現(xiàn)一個(gè)具有聊天功能和文件傳輸功能的QT插件。實(shí)驗(yàn)中使用非面向連接的UDP協(xié)議實(shí)現(xiàn)文字傳輸?shù)墓δ?,使用面向連接的TCP協(xié)議實(shí)現(xiàn)文件傳輸?shù)墓δ堋?.2完成功能(1)布局界面,創(chuàng)建若干個(gè)按鈕和輸入控件和一個(gè)現(xiàn)實(shí)控件,如圖1所示。(2)利用UDPSOCKET實(shí)現(xiàn)網(wǎng)絡(luò)聊天的功能。(3)利用TCPSOCKET實(shí)現(xiàn)文件傳輸?shù)墓δ?。圖1程序界面2網(wǎng)絡(luò)編程的預(yù)備知識(shí)2.1TCP/IP協(xié)議族簡(jiǎn)介TCP/IP體系結(jié)構(gòu)分為四層,分別是網(wǎng)絡(luò)接口層、網(wǎng)際層、運(yùn)輸層和應(yīng)用層。如圖2所示的一種分層次畫出具體協(xié)議的表示圖可知,TCP/IP協(xié)議族具有“兩頭大而中間小”的特點(diǎn)。應(yīng)用層和網(wǎng)絡(luò)接口層都有多種協(xié)議,而中間的IP層是最小的,上層的各種協(xié)議都向下匯聚到一個(gè)IP協(xié)議中。這種沙漏型的結(jié)構(gòu)表明:TCP/IP協(xié)議可以為各式各樣的應(yīng)用提供服務(wù)(所謂的everythingoverIP)。同時(shí)TCP/IP協(xié)議也允許IP協(xié)議在各式各樣的網(wǎng)絡(luò)結(jié)構(gòu)中構(gòu)成互聯(lián)網(wǎng)上運(yùn)行(所謂的IPovereverything)。正因?yàn)槿绱?,因特網(wǎng)才會(huì)發(fā)展到今天這種全球規(guī)模。從圖2不難看出IP協(xié)議在因特網(wǎng)中起到核心的作用。我們應(yīng)該知道的是,TCP/IP中的運(yùn)輸層向高層用戶屏蔽了下層的網(wǎng)絡(luò)核心細(xì)節(jié)(如網(wǎng)絡(luò)拓?fù)?、路由選擇協(xié)議等),它使應(yīng)用進(jìn)程看見的就是好像在兩個(gè)運(yùn)輸層實(shí)體之間有一條端到端的邏輯通信信道,盡管下層可能存在著非常復(fù)雜的協(xié)議。圖2TCP/IP協(xié)議族示意圖運(yùn)輸層有兩個(gè)主要的協(xié)議,分別是面向連接的TCP協(xié)議和無連接的UDP協(xié)議。下面詳細(xì)介紹這兩個(gè)協(xié)議。2.2用戶數(shù)據(jù)報(bào)協(xié)議UDP用戶數(shù)據(jù)報(bào)協(xié)議(UserDatagramProtocol,UDP)是一種無連接的網(wǎng)絡(luò)協(xié)議,它只是在IP的數(shù)據(jù)報(bào)服務(wù)之上增加了很少的功能,即復(fù)用和解復(fù)用以及差錯(cuò)檢測(cè)的功能。UDP的主要特點(diǎn)是:(1)UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接(當(dāng)然發(fā)送數(shù)據(jù)結(jié)束之后也沒有連接需要釋放),因此減少了開銷和發(fā)送數(shù)據(jù)之前的時(shí)延。(2)UDP使用盡最大努力交付,即不保證可靠交付,因此主機(jī)不需要維持復(fù)雜的連接狀態(tài)表。(3)UDP是面向報(bào)文的。發(fā)送方的UDP對(duì)應(yīng)用程序交下來的報(bào)文僅添加首部之后就交付給IP層,也就是說,應(yīng)用層交給UDP多長(zhǎng)的報(bào)文,UDP照樣發(fā)送。所以應(yīng)用程序應(yīng)該選擇合適的報(bào)文大小,若報(bào)文過長(zhǎng),則IP層將會(huì)對(duì)UDP報(bào)文進(jìn)行分片,降低了IP層的效率;反之,若報(bào)文太短,則導(dǎo)致IP首部相對(duì)過大,也降低了IP層的效率(4)UDP沒有擁塞控制,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會(huì)對(duì)主機(jī)的發(fā)送速率造成影響。這對(duì)實(shí)時(shí)應(yīng)用是很重要的。(5)UDP支持一對(duì)一、一對(duì)多、多對(duì)一和多對(duì)多的交互通信。(6)UDP首部?jī)H有8個(gè)字節(jié),開銷較小。2.3傳輸控制協(xié)議TCP傳輸控制協(xié)議(TransmissionControlProtocol,TCP)是TCP/IP體系中非常復(fù)雜的一個(gè)協(xié)議,它具有如下特點(diǎn):(1)TCP是面向連接的運(yùn)輸層協(xié)議。這就是說,應(yīng)用程序在使用TCP協(xié)議之前,必須先建立TCP連接。在傳送數(shù)據(jù)結(jié)束之后,必須釋放已建立的TCP連接。(2)每一條TCP連接只能有兩個(gè)端點(diǎn),每一條TCP連接只能是點(diǎn)對(duì)點(diǎn)的。(3)TCP提供可靠交付服務(wù)。也就是說,用戶可以通過TCP協(xié)議無差錯(cuò)、不丟失、不重復(fù)且按序到達(dá)地傳輸數(shù)據(jù)。(4)TCP提供全雙工通信。它允許連接的雙方在任何時(shí)候發(fā)送數(shù)據(jù)。(5)面向字節(jié)流。TCP中的“流”指的是流入進(jìn)程和從進(jìn)程流出的字節(jié)序列。即應(yīng)用程序與TCP的交互是一次一個(gè)數(shù)據(jù)塊,但TCP把應(yīng)用程序交下來的數(shù)據(jù)塊僅看成一連串無結(jié)構(gòu)的字節(jié)流。圖3TCP面向流的概念TCP對(duì)應(yīng)用進(jìn)程一次把多長(zhǎng)的報(bào)文發(fā)到TCP的緩存器中并不關(guān)心,它會(huì)根據(jù)其發(fā)送窗口的大小來調(diào)整一個(gè)報(bào)文段有多長(zhǎng)。如果發(fā)送來的數(shù)據(jù)太長(zhǎng),則它將對(duì)數(shù)據(jù)進(jìn)行分段,如果太短,則會(huì)等待數(shù)據(jù)達(dá)到一定大小再發(fā)送。TCP所謂的面向連接并不是指真正的物理連接,而是一條建立在各種可靠性保障機(jī)制上的序連接。連接是TCP最基本的抽象,TCP的很多特性都與其面向連接的 這個(gè)基本特性有關(guān)。如前所述,每一條TCP連接有兩個(gè)端點(diǎn),這個(gè)端點(diǎn)不是主機(jī),不是IP地址、不是進(jìn)程也不是運(yùn)輸層的端口,而是叫做套接字(SOCKET)。其定義是端口號(hào)拼接到點(diǎn)分十進(jìn)制表示的IP地址上,用冒號(hào)或者逗號(hào)隔開。例如,有IP地址30而端口號(hào)是80,那么得到的套接字則為(30:80)??傊覀冇刑捉幼謘ocket=(IP地址:端口號(hào))每一條TCP連接唯一地被通信兩端的兩個(gè)端點(diǎn)(即兩個(gè)套接字)所確定。即:TCP連接::={socket1,socket2}={(IP:port1),(IP,port2)}總而言之,TCP連接就是由協(xié)議軟件所提供的一種抽象。有時(shí)為了方便,我們也可以說,在一個(gè)應(yīng)用進(jìn)程和另一個(gè)應(yīng)用進(jìn)程之間建立了一條TCP連接,但被連接的兩端是套接字,同一個(gè)地址可以有多個(gè)不同的TCP連接,而同一個(gè)端口號(hào)也可以出現(xiàn)在多個(gè)不同的TCP連接中。TCP的可靠傳輸依靠于一系列復(fù)雜的機(jī)制,例如超時(shí)重傳、擁塞控制等等,不作詳述。3編程實(shí)現(xiàn)3.1編程環(huán)境Qt是一個(gè)1991年由奇趣科技開發(fā)的跨平臺(tái)C++圖形用戶界面應(yīng)用程序開發(fā)框架。它既可以開發(fā)GUI程序,也可開發(fā)非GUI程序,比如控制臺(tái)和服務(wù)器。Qt是面向?qū)ο笳Z言,易于擴(kuò)展,并且允許組件編程?;旧?,Qt同XWindow上的Motif,Openwin,GTK等圖形界面庫和Windows平臺(tái)上的MFC,OWL,VCL,ATL是同類型的東西。Qt與其他開發(fā)工具包最不相同的部分是它的“信號(hào)和槽”(signalandslot)機(jī)制,這也是它的中心特征。圖4信號(hào)和槽示意圖在圖形用戶界面編程中,我們希望一個(gè)窗口部件的一個(gè)變化被通知給另外一個(gè)窗口部件。更一般地,我們希望任何一類的對(duì)象可以與其他對(duì)象進(jìn)行通信。較老的工具包使用一種被稱作回調(diào)的通訊方式來實(shí)現(xiàn)同一目的。回調(diào)是指一個(gè)函數(shù)指針,所以如果你希望一個(gè)處理函數(shù)通知你一些事件,你可以把另一個(gè)函數(shù)回調(diào)的指針傳遞給處理函數(shù)。處理函數(shù)在適當(dāng)?shù)臅r(shí)候調(diào)用回調(diào)?;卣{(diào)有兩個(gè)主要的缺點(diǎn)。首先他們不是類型安全的。我們從不確定處理函數(shù)使用了正確的參數(shù)來調(diào)用回調(diào)。其次回調(diào)和處理函數(shù)是非常強(qiáng)地聯(lián)系在一起的,因?yàn)樘幚砗瘮?shù)必須知道要調(diào)用哪個(gè)回調(diào)。信號(hào)和槽機(jī)制是指,當(dāng)一個(gè)特定事件發(fā)生的時(shí)候,一個(gè)信號(hào)被發(fā)射。Qt的窗口部件有很多預(yù)定義的信號(hào),但是我們總是可以通過繼承來加入我們自己的信號(hào)。槽就是一個(gè)可以被調(diào)用處理特定信號(hào)的函數(shù)。Qt的窗口部件又很多預(yù)定義的槽,但是通常的習(xí)慣是你可以加入自己的槽,這樣你就可以處理你所感興趣的信號(hào)。信號(hào)和槽的機(jī)制是類型安全的:一個(gè)信號(hào)的簽名必須與它的接收槽的簽名相匹配。(實(shí)際上一個(gè)槽的簽名可以比它接收的信號(hào)的簽名少,因?yàn)樗梢院雎灶~外的簽名。)因?yàn)楹灻且恢碌模幾g器就可以幫助我們檢測(cè)類型不匹配。信號(hào)和槽是寬松地聯(lián)系在一起的:一個(gè)發(fā)射信號(hào)的類不用知道也不用注意哪個(gè)槽要接收這個(gè)信號(hào)。Qt的信號(hào)和槽的機(jī)制可以保證如果你把一個(gè)信號(hào)和一個(gè)槽連接起來,槽會(huì)在正確的時(shí)間使用信號(hào)的參數(shù)而被調(diào)用。信號(hào)和槽可以使用任何數(shù)量、任何類型的參數(shù)。它們是完全類型安全的:不會(huì)再有回調(diào)核心轉(zhuǎn)儲(chǔ)(coredump)。從QObject類或者它的一個(gè)子類(比如QWidget類)繼承的所有類可以包含信號(hào)和槽。當(dāng)對(duì)象改變它們的狀態(tài)的時(shí)候,信號(hào)被發(fā)送,從某種意義上講,它們也許對(duì)外面的世界感興趣。這就是所有的對(duì)象通訊時(shí)所做的一切。它不知道也不注意無論有沒有東西接收它所發(fā)射的信號(hào)。這就是真正的信息封裝,并且確保對(duì)象可以用作一個(gè)軟件組件。3.2QtNetworkQtNetwork是QT為用戶提供網(wǎng)絡(luò)功能的庫,里面封裝好許多個(gè)類為用戶所用。本次試驗(yàn)用到的是QTcpServer、QTcpSocket和QUdpSocket這三個(gè)類。QTcpServer提供一個(gè)TCP基礎(chǔ)服務(wù)類,這個(gè)類用來接收到來的TCP連接,可以指定TCP端口或者用QTcpServer挑選一個(gè)端口,可以監(jiān)聽一個(gè)指定的地址或者所有的機(jī)器地址。用它的listen()函數(shù)監(jiān)聽所有連接,在有客戶端連接到服務(wù)器端就會(huì)發(fā)射一個(gè)newConnection()信號(hào),此時(shí)可以調(diào)用nextPendingConnection()來接受待處理的連接,并返回一個(gè)QTcpSocket,我們可以用這個(gè)返回的套接字和客戶端連接并通信。QTcpSocket類提供一個(gè)套接字,可以用bind()函數(shù)綁定一個(gè)主機(jī)的端口,也可以用connectToHost()函數(shù)請(qǐng)求一個(gè)TCP連接。QUdpSocket類可以用來發(fā)送和接收UDP數(shù)據(jù)報(bào)。采用UDP時(shí),數(shù)據(jù)是以數(shù)據(jù)報(bào)的形式從一個(gè)主機(jī)發(fā)送到另一個(gè)主機(jī)的,此中沒有連接的概念,如果UDP數(shù)據(jù)報(bào)沒有成功發(fā)送,它并不會(huì)向發(fā)送者發(fā)送任何錯(cuò)誤報(bào)告。3.3整體結(jié)構(gòu)和子模塊劃分圖5整體結(jié)構(gòu)圖程序由主界面(TestWork)、TCP服務(wù)器類(MyServer)、發(fā)送文件類(Sender)和接收文件類(Receiver)組成。MyServer類派生自QTcpServer類,實(shí)質(zhì)上是圖6主界面類的結(jié)構(gòu)圖一個(gè)TCP服務(wù)器,程序啟動(dòng)時(shí)就會(huì)調(diào)用它建立一個(gè)服務(wù)器進(jìn)行TCP連接的監(jiān)聽。當(dāng)一個(gè)新的連接請(qǐng)求到來時(shí),它將生成一個(gè)選項(xiàng)框(QMessageBox)作傳輸控制,用戶單擊Yes后接收端才建立套接字傳輸數(shù)據(jù),傳輸完成后雙方都關(guān)閉套接字。等待下一次的連接。傳輸文件子模塊可以理解為一個(gè)C/S結(jié)構(gòu)的程序,客戶端只有在向服務(wù)器提出文件傳輸?shù)恼?qǐng)求,服務(wù)器,即接收端才根據(jù)請(qǐng)求分配一個(gè)新的套接字進(jìn)行傳輸任務(wù),然而在程序運(yùn)行的任何時(shí)刻,用戶都可以使用聊天的功能,這由QUdpSocket來完成。主界面類(TestWork)為整個(gè)程序提供一個(gè)交互界面,完成所有交互功能,結(jié)構(gòu)如圖6所示。它包括了一些按鈕和輸入控件,一個(gè)用于顯示聊天內(nèi)容和一些信息提示的文本瀏覽器。除了提供界面外,該類還完成了聊天內(nèi)容的收發(fā)。聊天是通過UDP數(shù)據(jù)包來實(shí)現(xiàn)的。圖7服務(wù)器類(Myserver)結(jié)構(gòu)圖服務(wù)器類(Myserver)監(jiān)聽文件傳輸?shù)恼?qǐng)求,并且每當(dāng)新連接到來時(shí)實(shí)例化一個(gè)接收文件類(Receiver),實(shí)現(xiàn)文件的傳輸。當(dāng)用戶點(diǎn)擊發(fā)送按鈕時(shí),程序就會(huì)實(shí)例化一個(gè)Sender類,如圖8所示,并向該類待傳輸文件的路徑,然后發(fā)送文件。接收文件類(Receiver)與發(fā)送類十分相似,不作贅述。圖8文件發(fā)送類(Sender)的結(jié)構(gòu)圖9文件傳輸流程圖4關(guān)鍵模塊分析4.1聊天內(nèi)容傳輸模塊MyUdpSocket=newQUdpSocket(this);//創(chuàng)建一個(gè)QUdpSocketMyUdpSocket->bind(QHostAddress::Any,1234);//綁定端口connect(MyUdpSocket,SIGNAL(readyRead()),SLOT(readUdpsocket()));//連接數(shù)據(jù)到來的信號(hào)和讀取數(shù)據(jù)的槽voidTestWork::on_sendBtn_clicked()//發(fā)送聊天內(nèi)容的按鈕響應(yīng){QByteArraydata;//存儲(chǔ)待發(fā)送的數(shù)據(jù)data.append(ui->NameEdit->text().toUtf8());//獲取發(fā)送者的昵稱data.append(":\r");data.append(ui->lineEdit->text().toUtf8()+"\n");//獲取對(duì)話內(nèi)容QHostAddresshost;host=ui->ipEdit->text();//獲得目標(biāo)的IP地址MyUdpSocket->writeDatagram(data,host,1234);//用QUdpSocket發(fā)送數(shù)據(jù)報(bào)ui->DialogWin->append(data);//在本機(jī)的聊天窗口顯示自己發(fā)送的內(nèi)容}voidTestWork::readUdpsocket()//讀取UDP數(shù)據(jù)報(bào)的內(nèi)容{QByteArraytoshow;//存儲(chǔ)接收回來的數(shù)據(jù)報(bào)toshow.resize(MyUdpSocket->pendingDatagramSize());//使toshow和數(shù)據(jù)報(bào)大小相等MyUdpSocket->readDatagram(toshow.data(),toshow.size());//讀取數(shù)據(jù)報(bào)ui->DialogWin->append(toshow);//顯示聊天內(nèi)容}聊天功能僅涉及到兩個(gè)QUdpSocket的數(shù)據(jù)交換,發(fā)送端除了攜帶用戶所說的話,還要攜帶用戶的名字,以便接收端的用戶能知道發(fā)送者的身份,也有利于清晰地顯示出對(duì)話的內(nèi)容。由于UDP連接并沒有建立連接,所以每個(gè)程序只要有一個(gè)QUdpSocket就可以實(shí)現(xiàn)跟其他任何用戶通信。4.2文件傳輸模塊voidMyServer::StartServer(){if(listen(QHostAddress::Any,8765))//建立服務(wù)器,監(jiān)聽8765端口{qDebug()<<"started";}else{qDebug()<<"notstarted";}}voidMyServer::incomingConnection(inthandle)//重寫了原生的連接處理函數(shù){qDebug()<<"receiverstarts"<<handle;Receiver*receiver=newReceiver;//有新連接請(qǐng)求時(shí),建立一個(gè)文件接收類connect(receiver,SIGNAL(destroyed()),this,SLOT(ReceiverClosed()));receiver->setAttribute(Qt::WA_DeleteOnClose,true);//傳輸完成時(shí)釋放資源receiver->SetSocket(handle);receiver->show();}客戶端(發(fā)送端)voidTestWork::on_FileBtn_clicked()//發(fā)送文件按鈕響應(yīng){fileName=QFileDialog::getOpenFileName(this);//獲得發(fā)送文件名if(!fileName.isEmpty()){ui->FileBtn->setEnabled(false);//發(fā)送過程中不能再按發(fā)送ui->DialogWin->append(fileName);host=ui->ipEdit->text();//獲得目標(biāo)IP地址sender=newSender(host,fileName);//實(shí)例化一個(gè)Sender類connect(sender,SIGNAL(transferFinish()),this,SLOT(transferFinish()));//發(fā)送完成時(shí)作出提示connect(sender,SIGNAL(destroyed()),this,SLOT(ResetBtn()));//當(dāng)sender類銷毀后,重新激活發(fā)送文件按鈕sender->setAttribute(Qt::WA_DeleteOnClose,true);sender->show();}Sender類建立之后,會(huì)創(chuàng)建一個(gè)QTcpSocket來進(jìn)行數(shù)據(jù)的傳輸。程序如下:tcpClient=newQTcpSocket(this);connect(tcpClient,SIGNAL(connected()),SLOT(startTransfer()));//連接建立后,開始傳輸數(shù)據(jù)connect(tcpClient,SIGNAL(disconnected()),this,SLOT(close()));//QTcpSocket斷開連接后,關(guān)閉這個(gè)Sender類connect(tcpClient,SIGNAL(bytesWritten(qint64)),SLOT(updateClientProgress(qint64)));//每發(fā)送一段數(shù)據(jù),更新發(fā)送進(jìn)度條并且載入下一次發(fā)送的數(shù)據(jù)塊tcpClient->connectToHost(host,8765);//向接收端發(fā)起連接文件傳輸開始時(shí),會(huì)先傳輸待發(fā)送文件的基本信息:voidSender::startTransfer()//開始傳輸,先發(fā)送文件的大小等信息{qDebug()<<"connectedddd";localFile=newQFile(fileName);if(!localFile->open(QFile::ReadOnly)){qDebug()<<"openfileerror!";return;}totalBytes=localFile->size();//文件總大小QDataStreamsendOut(&outBlock,QIODevice::WriteOnly);sendOut.setVersion(QDataStream::Qt_4_6);QStringcurrentFileName=fileName.right(fileName.size()-fileName.lastIndexOf('/')-1);sendOut<<qint64(0)<<qint64(0)<<currentFileName;//依次寫入總大小信息空間,文件名大小信息空間,文件名totalBytes+=outBlock.size();//這里的總大小是文件名大小等信息和實(shí)際文件大小的總和sendOut.device()->seek(0);sendOut<<totalBytes<<qint64((outBlock.size()-sizeof(qint64)*2));//返回outBolock的開始,用實(shí)際的大小信息代替兩個(gè)qint64(0)空間bytesToWrite=totalBytes-tcpClient->write(outBlock);//發(fā)送完頭數(shù)據(jù)后剩余數(shù)據(jù)的大小outBlock.resize(0);}bytesWritten變量的變化用于調(diào)用更新進(jìn)度條的程序段,也就是說,每當(dāng)發(fā)送一個(gè)固定長(zhǎng)度的數(shù)據(jù),就會(huì)更新一次進(jìn)度條,并且更新待發(fā)送的數(shù)據(jù)塊。voidSender::updateClientProgress(qint64numBytes)//不斷更新進(jìn)度條,實(shí)現(xiàn)文件的傳送{bytesWritten+=(int)numBytes;//已經(jīng)發(fā)送數(shù)據(jù)的大小if(bytesToWrite>0)//如果已經(jīng)發(fā)送了數(shù)據(jù){outBlock=localFile->read(qMin(bytesToWrite,loadSize));//每次發(fā)送loadSize大小的數(shù)據(jù),這里設(shè)置為4KB,如果剩余的數(shù)據(jù)不足4KB,//就發(fā)送剩余數(shù)據(jù)的大小bytesToWrite-=(int)tcpClient->write(outBlock);//發(fā)送完一次數(shù)據(jù)后還剩余數(shù)據(jù)的大小outBlock.resize(0);//清空發(fā)送緩沖區(qū)}else{localFile->close();//如果沒有發(fā)送任何數(shù)據(jù),則關(guān)閉文件}ui->progressBar->setMaximum(totalBytes);ui->progressBar->setValue(bytesWritten);//更新進(jìn)度條if(bytesWritten==totalBytes)//發(fā)送完畢{emittransferFinish();localFile->close();tcpClient->close();this->deleteLater();}}5開發(fā)工具本實(shí)驗(yàn)所采用的開發(fā)工具為Qt5.0.2。5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論