版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《計(jì)算機(jī)網(wǎng)絡(luò)》課程設(shè)計(jì)說(shuō)明書(shū)題目:基于UDP協(xié)議網(wǎng)上聊天程序?qū)W院:計(jì)算機(jī)科學(xué)與工程學(xué)院專(zhuān)業(yè):信息平安姓名:學(xué)號(hào):1000360222指導(dǎo)教師:孫晉永目錄1協(xié)議介紹和使用說(shuō)明31.1協(xié)議內(nèi)容31.2關(guān)鍵技術(shù)41.2.1效勞器端Socket的實(shí)現(xiàn)41.2.2通信的建立52程序設(shè)計(jì)62.1系統(tǒng)結(jié)構(gòu)62.2主程序設(shè)計(jì)72.2.1效勞器端程序72.2.2客戶(hù)端程序72.3各模塊設(shè)計(jì)8客戶(hù)端向效勞器發(fā)送消息8客戶(hù)端之間發(fā)送消息82.4界面設(shè)計(jì)82.4.1聊天界面設(shè)計(jì)的方法82.4.2界面的功能92.5實(shí)現(xiàn)主要代碼92.6程序調(diào)試及運(yùn)行結(jié)果152.6.1調(diào)試前的準(zhǔn)備152.6.2程序調(diào)試過(guò)程162.6.3程序運(yùn)行結(jié)果163課設(shè)體會(huì)17參考文獻(xiàn)181協(xié)議介紹和使用說(shuō)明1.1協(xié)議內(nèi)容本課程設(shè)計(jì)主要是基于UDP的并用Java實(shí)現(xiàn)的簡(jiǎn)單的聊天程序。UDP用戶(hù)數(shù)據(jù)報(bào)是在運(yùn)輸層的端到端抽象的邏輯信道中傳送的。UDP在傳送數(shù)據(jù)之前不需要先建立連接。對(duì)方的運(yùn)輸層在收到UDP報(bào)文后,不需要給出任何確認(rèn)。雖然UDP不提供可靠交付,但在某些情況下UDP是一種最有效的工作方式。雖然UDP用戶(hù)數(shù)據(jù)報(bào)只能提供不可靠的交付,但UDP在某些方面有其特殊的優(yōu)點(diǎn),它有即時(shí)通信的功能。比方說(shuō),使用聊天程序聊天的時(shí)候,省去的了跟對(duì)方通信的時(shí)候的鏈接的麻煩,直接進(jìn)行通信。UDP只在IP的數(shù)據(jù)報(bào)效勞之上增加了很少一點(diǎn)的功能,即端口的功能和過(guò)失檢測(cè)的功能。UDP使用盡最大努力交付,即不保證可靠交付,同時(shí)也不使用擁塞控制。UDP是面向報(bào)文的。UDP沒(méi)有擁塞控制,很適合多媒體通信的要求。UDP支持一對(duì)一、一對(duì)多、多對(duì)一和多對(duì)多的交互通信。發(fā)送方UDP對(duì)應(yīng)用程序交下來(lái)的報(bào)文,在添加首部后就向下交付IP層。UDP對(duì)應(yīng)用層交下來(lái)的報(bào)文,既不合并,也不拆分,而是保存這些報(bào)文的邊界。應(yīng)用層交給UDP多長(zhǎng)的報(bào)文,UDP就照樣發(fā)送,即一次發(fā)送一個(gè)報(bào)文。接收方UDP對(duì)IP層交上來(lái)的UDP用戶(hù)數(shù)據(jù)報(bào),在去除首部后就原封不動(dòng)地交付上層的應(yīng)用進(jìn)程,一次交付一個(gè)完整的報(bào)文。圖1.1UDP根本工作過(guò)程1.2關(guān)鍵技術(shù)效勞器端Socket的實(shí)現(xiàn)Socket又稱(chēng)作套接字,它是使用標(biāo)準(zhǔn)Unix
文件描述符(file
descriptor)
和其它程序通訊的方式。使用send()和recv()讓你更好的控制數(shù)據(jù)傳輸。在Java網(wǎng)絡(luò)編程中,socket相當(dāng)于應(yīng)用程序的港口碼頭;在計(jì)算機(jī)網(wǎng)絡(luò)中,套接字由ip地址和端口號(hào)組成,為進(jìn)程之間通信提供地址。兩個(gè)主機(jī)進(jìn)行通信實(shí)際上就是兩個(gè)主機(jī)中的應(yīng)用進(jìn)程互相通信,應(yīng)用進(jìn)程之間的通信又稱(chēng)為端到端的通信。為應(yīng)用進(jìn)程之間的通信提供運(yùn)輸效勞的是運(yùn)輸層的運(yùn)輸協(xié)議,運(yùn)輸層需要有兩種不同的運(yùn)輸協(xié)議,即面向連接的TCP和無(wú)連接的UDP。在Java中,用于實(shí)現(xiàn)基于UDP的聊天程序,使用兩個(gè)重要的類(lèi)〔DatagramSocket類(lèi)和DatagramPacket類(lèi)〕。DatagramSocket類(lèi)表示用來(lái)發(fā)送和接收數(shù)據(jù)報(bào)包的套接字。數(shù)據(jù)報(bào)套接字是包投遞效勞的發(fā)送或接收點(diǎn)。每個(gè)在數(shù)據(jù)報(bào)套接字上發(fā)送或接收的包都是單獨(dú)編址和路由的。從一臺(tái)機(jī)器發(fā)送到另一臺(tái)機(jī)器的多個(gè)包可能選擇不同的路由,也可能按不同的順序到達(dá)。在DatagramSocket上總是啟用UDP播送發(fā)送。為了接收播送包,應(yīng)該將DatagramSocket綁定到通配符地址。在某些實(shí)現(xiàn)中,將DatagramSocket綁定到一個(gè)更加具體的地址時(shí)播送包也可以被接收。atagramPacket類(lèi)表示數(shù)據(jù)報(bào)包。數(shù)據(jù)報(bào)包用來(lái)實(shí)現(xiàn)無(wú)連接包投遞效勞。每條報(bào)文僅根據(jù)該包中包含的信息從一臺(tái)機(jī)器路由到另一臺(tái)機(jī)器。從一臺(tái)機(jī)器發(fā)送到另一臺(tái)機(jī)器的多個(gè)包可能選擇不同的路由,也可能按不同的順序到達(dá)。不對(duì)包投遞做出保證。效勞程序工作在效勞器的某個(gè)端口上,一旦啟動(dòng)效勞,它將在這個(gè)端口上監(jiān)聽(tīng),等待客戶(hù)程序發(fā)來(lái)請(qǐng)求,當(dāng)有客戶(hù)連接到該端口,accept〔〕方法就返回一個(gè)Socket對(duì)象,可以用該對(duì)象獲得一個(gè)輸入輸出流。效勞器的套接字用效勞器套接字類(lèi)〔ServerSocket〕來(lái)建立。具體實(shí)現(xiàn)如下:(1)建立一個(gè)效勞者,端口為5000。(2)效勞者永遠(yuǎn)等待,一旦客戶(hù)送來(lái)正確的請(qǐng)求,連接至該端口,accept〔〕方法就返回一個(gè)Socket對(duì)象。(3)用返回的Socket對(duì)象創(chuàng)立數(shù)據(jù)輸入流類(lèi)的實(shí)例in。用返回的Socket對(duì)象創(chuàng)立數(shù)據(jù)輸出流的實(shí)例out。以上實(shí)例in和out是效勞者用于從客戶(hù)接受輸入信息和向客戶(hù)程序發(fā)送信息所用。此外,還需要用方法readline〔〕和println〔〕讀取或輸出一行數(shù)據(jù)。(4)soc.close〔〕關(guān)閉Socket。圖1.2基于UDP的SOCKET編程模型通信的建立在客戶(hù)端建立Socket對(duì)象,并進(jìn)行異常處理,主機(jī)名和端口號(hào)與連接的效勞器名和提供該效勞的效勞程序的監(jiān)聽(tīng)端口必須一致。建立連接后用Socket類(lèi)提供的getInputStream〔〕和getOutputStream〔〕方法取得輸入輸出流。在效勞器端,獲得的輸入流是客戶(hù)端的輸出流,而Socket獲得的輸出流是發(fā)向客戶(hù)端的輸入流,在客戶(hù)端也是這樣。獲得socket的輸入輸出流之后,為了便于讀寫(xiě)操作,需要在這兩個(gè)流對(duì)象根底上建立易于操作的數(shù)據(jù)流DateInputStream,DataOutputStream。然后對(duì)輸入輸出流進(jìn)行讀寫(xiě)操作。在通信結(jié)束時(shí)關(guān)閉socket,以斷開(kāi)連接,釋放資源。先關(guān)閉對(duì)應(yīng)的輸入輸出流,再關(guān)閉socket本身。2程序設(shè)計(jì)2.1系統(tǒng)結(jié)構(gòu)本系統(tǒng)采用一個(gè)效勞器端和多個(gè)客戶(hù)端的聊天方式來(lái)實(shí)現(xiàn)。結(jié)構(gòu)圖如下所示:圖2.1效勞器-客戶(hù)端結(jié)構(gòu)圖2.2主程序設(shè)計(jì)效勞器端程序效勞器與客戶(hù)間通過(guò)套接口Socket連接。在java中使用套接口相當(dāng)簡(jiǎn)單,JavaAPI為處理套接口的通信提供了一個(gè)類(lèi).Socket.,使得編寫(xiě)網(wǎng)絡(luò)應(yīng)用程序相對(duì)容易.效勞器采用多線程以滿(mǎn)足多用戶(hù)的請(qǐng)求,程序用vector向量數(shù)組存儲(chǔ)連接客戶(hù)變量,通過(guò)創(chuàng)立一個(gè)ServerSocket對(duì)象來(lái)監(jiān)聽(tīng)來(lái)自客戶(hù)的連接請(qǐng)求,默認(rèn)端口為6666,然后無(wú)限循環(huán)調(diào)用accept()方法接受客戶(hù)程序的連接??蛻?hù)端程序客戶(hù)端是一個(gè)JavaApplet程序,客戶(hù)通過(guò)Socket建立與效勞器的連接。圖2.2主程序流程圖2.3各模塊設(shè)計(jì)客戶(hù)端向效勞器發(fā)送消息效勞器與客戶(hù)都通過(guò)構(gòu)造DataInputStream,PrintStream來(lái)建立輸入輸出流,然后雙方通過(guò)該輸入輸出流來(lái)相互傳遞信息,一旦收到客戶(hù)方的連接請(qǐng)求,效勞器accept()方法返回一個(gè)新建的Socket對(duì)象??蛻?hù)端然后向效勞器發(fā)送消息,客戶(hù)端之間發(fā)送消息客戶(hù)間發(fā)送信息通過(guò)UDP協(xié)議來(lái)實(shí)現(xiàn),用戶(hù)登錄時(shí)通過(guò)類(lèi)DatagramPacket和DatagramSocket創(chuàng)立UDP包括其本地接受端口以及發(fā)送端口,默認(rèn)端口為newDatagramSocket〔〕和nickNameField.getText〔〕,通過(guò)向效勞器發(fā)送消息,然后效勞器播送消息,最好到達(dá)群聊的目的??蛻?hù)端發(fā)送消息〔send(DatagramPacket)和接受消息(receive(DatagramPacket))。2.4界面設(shè)計(jì)2.4.1聊天界面設(shè)計(jì)的方法在Frame布局容器中,添加一個(gè)顯示聊天的TextArea文本框〔在上面〕,參加Panel面板,Panel面板中包括一個(gè)發(fā)送消息的TextField單行文本框,“聊天記錄〞和“發(fā)送〞兩個(gè)按鈕監(jiān)聽(tīng)。圖2.3聊天界面實(shí)現(xiàn)功能圖2.4.2界面的功能①客戶(hù)端登陸界面輸入效勞器IP,接收端口,及用戶(hù)名。登陸效勞器,與效勞器建立連接,進(jìn)入聊天界面。②客戶(hù)端聊天界面,進(jìn)行聊天。并可查看聊天記錄。③效勞器界面,監(jiān)聽(tīng)客戶(hù)端連接狀況并可發(fā)送效勞器消息。2.5實(shí)現(xiàn)主要代碼客戶(hù)端代碼:packageudp;importjava.io.*;importjava.awt.*;importjava.awt.event.*;import.*;classClientimplementsActionListener,Runnable{privateFrameframe,f1,f2;//聊天窗口和登陸窗口privatePanelp1,p2,p3;privateButtonsendButton,b,c,d;privateTextFieldserverIpField,sendField,receivePortField,nickNameField;privateTextAreacurrentUserField;booleanisClient=false;privateTextAreamessageArea;//聊天記錄框privateStringserverIp;privateintserverReceivePort=6666;//效勞器接收默認(rèn)端口privateDatagramSocketreceiveSocket=null,sendSocket=null;privateDatagramPacketreceivePacket=null,sendPacket=null;//客戶(hù)端登陸界面publicvoidinputIP(){ }//聊天記錄界面publicvoidinput(){ }//客戶(hù)端聊天界面publicvoidlaunchFrame(){ }//啟動(dòng)客戶(hù)端,完成登錄publicvoidstart(){try{sendSocket=newDatagramSocket();//客戶(hù)機(jī)發(fā)送端口 sendMessage(nickNameField.getText()+":" +receivePortField.getText()+":");//名字和接收端口newThread(this).start(); }catch(Exceptione){messageArea.append(e+"\n"); } }//客戶(hù)端發(fā)送消息publicvoidsendMessage(Stringstr){try{ ByteArrayOutputStreamout=newByteArrayOutputStream();//捕獲內(nèi)存緩沖區(qū)的數(shù)據(jù),轉(zhuǎn)換成字節(jié)數(shù)組 PrintStreampout=newPrintStream(out);//輸出字節(jié) pout.print(str);byte[]buf=out.toByteArray();sendPacket=newDatagramPacket(buf,buf.length,InetAddress .getByName(serverIp),serverReceivePort);//構(gòu)造數(shù)據(jù)報(bào)包sendSocket.send(sendPacket);//發(fā)送數(shù)據(jù)報(bào)包 buf=null; }catch(Exceptione){ e.printStackTrace();messageArea.append("消息:"+str+"發(fā)送失敗,你還沒(méi)有登錄,或已經(jīng)掉線!\n"); } }//多線程,啟動(dòng)接收信息publicvoidrun(){ receiveMessage(); }//客戶(hù)機(jī)接收消息publicvoidreceiveMessage() {try{receiveSocket=newDatagramSocket(Integer .parseInt(receivePortField.getText()));//客戶(hù)機(jī)接受端口while(true){byte[]buf=newbyte[200];receivePacket=newDatagramPacket(buf,buf.length);receiveSocket.receive(receivePacket);if(receivePacket.getLength()==0){messageArea.append("空消息"+"\n");continue; } ByteArrayInputStreambin=newByteArrayInputStream(receivePacket.getData());//字節(jié)串變成輸入流 BufferedReaderread=newBufferedReader(newInputStreamReader( bin));//先把字節(jié)流轉(zhuǎn)換為字符流,然后放入緩沖區(qū) Stringstr=read.readLine();messageArea.append(str);if(str.contains("迎:/")){ }messageArea.append("\n"); read.close(); bin.close(); } }catch(Exceptione){messageArea.append(e+"sendmessageerror\n");} }//事件響應(yīng)處理publicvoidactionPerformed(ActionEvente){ }//程序主入口publicstaticvoidmain(String[]args){ Clientclient=newClient();//client.input(); client.inputIP(); }效勞端端代碼:packageudp;importjava.io.*;importjava.awt.*;importjava.awt.event.*;import.*;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;importjava.util.Iterator;publicclassServerimplementsActionListener{privateFrameframe;//主窗體privateLabelconnectLabel,messageLabel;privateTextAreamessageArea;//消息框,顯示用戶(hù)登錄信息privateTextFieldsendField;//輸入聊天內(nèi)容的文本框privateButtonsendButton;//發(fā)送按鈕privateDatagramSocketreceiveSocket=null,sendSocket=null;privateDatagramPacketreceivePacket=null,sendPacket=null;privateintserverReceivePort=6666;//效勞器端的接收端口privateList<ClientMessage>clientList=newArrayList<ClientMessage>();//保存連接的客戶(hù)端信息booleanisServer=true;//程序主入口publicstaticvoidmain(String[]args){ Serverserver=newServer(); server.launchFrame(); server.start();//啟動(dòng)效勞器 server.receiveMessage();//接收信息 }//效勞端界面初始化publicvoidlaunchFrame(){ }//事件監(jiān)聽(tīng)處理publicvoidactionPerformed(ActionEvente){ } }//啟動(dòng)效勞器publicvoidstart(){try{sendSocket=newDatagramSocket(6660);//效勞器發(fā)送端口 }catch(Exceptione){messageArea.append(e+"\n"); } }//效勞器接收消息publicvoidreceiveMessage() {try{receiveSocket=newDatagramSocket(serverReceivePort);//效勞器接受端口while(true){byte[]buf=newbyte[200];receivePacket=newDatagramPacket(buf,buf.length);receiveSocket.receive(receivePacket);intlength=clientList.size();booleanhave=false; ByteArrayInputStreambin=newByteArrayInputStream(receivePacket.getData()); BufferedReaderread=newBufferedReader(newInputStreamReader( bin)); Stringstr=read.readLine();for(inti=0;i<length;i++){ ClientMessageoldMsg=clientList.get(i);if(oldMsg.hasClient(receivePacket.getPort(),receivePacket.getAddress())){ have=true;break; } }//未存在此客戶(hù)端if(!have){ ClientMessagenewMsg=newClientMessage( Integer.parseInt(str.split(":")[1].trim()),receivePacket.getPort(),receivePacket.getAddress());messageArea.append("用戶(hù):"+str.split(":")[0] +"進(jìn)入聊天室,其IP地址:" +receivePacket.getAddress().getHostAddress() +"發(fā)送端口:"+newMsg.getSendPort()+"接收端口:" +newMsg.getReceivePort()+"登錄時(shí)間:" +newDate()+"\n");clientList.add(newMsg); sendMessage("熱烈歡送:"+str.split(":")[0]+"IP:" +receivePacket.getAddress().getHostAddress() +"參加聊天室!\n"); }else{//用戶(hù)已經(jīng)存在 sendMessage(str); } read.close(); bin.close(); } }catch(Exceptione){///e.printStackTrace();messageArea.append(e+"sendmessageerror\n"); } }//效勞器端發(fā)送消息給客戶(hù)端publicvoidsendToClient(){ }//效勞器播送消息publicvoidsendMessage(Stringstr){ ByteArrayOutputStreamout=newByteArrayOutputStream(); PrintStreampout=newPrintStream(out); pout.print(str);byte[]buf=out.toByteArray();//緩沖區(qū)intlength=clientList.size();try{//轉(zhuǎn)發(fā)給每一個(gè)在線用戶(hù)for(inti=0;i<length;i++){ ClientMessagemsg=clientList.get(i);sendPacket=newDatagramPacket(buf,buf.length, msg.getClientIp(),msg.getReceivePort());sendSocket.send(sendPacket); } }catch(IOExceptione){ e.printStackTrace(); } buf=null; }}classClientMessage{privateintreceivePort;//客戶(hù)端的接收端口privateintsendPort;//客戶(hù)端的發(fā)送端口privateInetAddressclientIp;//客戶(hù)端的IPpublicClientMessage(intreceivePort,intsendPort,InetAddressclientIp){this.receivePort=receivePort;this.clientIp=clientIp;this.sendPort=sendPort; }publicintgetReceivePort(){returnreceivePort; }publicInetAddressgetClientIp(){returnclientIp; }publicintgetSendPort(){returnsendPort; }publicbooleanhasClient(intsendPort,InetAddressip){if(ip.getHostAddress().equals(this.getClientIp().getHostAddress()) &&sendPort==this.getSendPort()){returntrue; }returnfalse; }}2.6程序調(diào)試及運(yùn)行結(jié)果2.6.1調(diào)試前的準(zhǔn)備安裝jdk并在計(jì)算機(jī)的環(huán)境變量中配置好java環(huán)境。使用的實(shí)驗(yàn)環(huán)境是Windows7,EclipseSDK版本:,。2.6.2程序調(diào)試過(guò)程啟動(dòng)eclipse,單機(jī)測(cè)試。首先在主機(jī)上運(yùn)行效勞器端程序,再在器上運(yùn)行3個(gè)客戶(hù)端程序。然后進(jìn)入到用戶(hù)的圖形用戶(hù)界面,輸入效勞器的IP,進(jìn)行連接,如果連接成功,那么客戶(hù)端就可以通過(guò)與效勞器端進(jìn)行通信,然后效勞器轉(zhuǎn)發(fā)通信,實(shí)現(xiàn)了多個(gè)客戶(hù)之間的聊天
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)內(nèi)部實(shí)驗(yàn)室環(huán)境監(jiān)測(cè)的必要性分析
- 商業(yè)決策支持系統(tǒng)的嵌入式技術(shù)解析
- 2025中國(guó)聯(lián)通楚雄州分公司運(yùn)營(yíng)公司招聘26人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)移動(dòng)通信集團(tuán)浙江限公司校園招聘1130人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)石油遼陽(yáng)石化分公司高校畢業(yè)生招聘93人(遼寧)高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)電建集團(tuán)昆明勘測(cè)設(shè)計(jì)研究院限公司招聘100人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 板坯連鑄機(jī)行業(yè)相關(guān)投資計(jì)劃提議范本
- 2025中國(guó)煙草鄭州煙草研究院招聘4人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)建筑一局(集團(tuán))限公司軌道交通項(xiàng)目部總工程師招聘1人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)交通建設(shè)集團(tuán)限公司招聘200人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年中小學(xué)春節(jié)安全教育主題班會(huì)課件
- GB/T 18281.3-2024醫(yī)療保健產(chǎn)品滅菌生物指示物第3部分:濕熱滅菌用生物指示物
- 班會(huì)課件高中
- 探索心理學(xué)的奧秘智慧樹(shù)知到期末考試答案章節(jié)答案2024年北京大學(xué)
- 《微觀經(jīng)濟(jì)學(xué)》課程思政教學(xué)案例(一等獎(jiǎng))
- 作文考試專(zhuān)用稿紙 (A3完美打印版)
- 電廠一次調(diào)頻試驗(yàn)方案
- 裝修公司驗(yàn)收單
- 染色體標(biāo)本的制作及組型觀察
- 2003年高考全國(guó)卷.理科數(shù)學(xué)試題及答案
- 我國(guó)互聯(lián)網(wǎng)企業(yè)價(jià)值評(píng)估的研究——以阿里巴巴網(wǎng)絡(luò)公司為例
評(píng)論
0/150
提交評(píng)論