網(wǎng)絡(luò)編程-基于TCP的簡(jiǎn)易聊天室-實(shí)驗(yàn)報(bào)告_第1頁(yè)
網(wǎng)絡(luò)編程-基于TCP的簡(jiǎn)易聊天室-實(shí)驗(yàn)報(bào)告_第2頁(yè)
網(wǎng)絡(luò)編程-基于TCP的簡(jiǎn)易聊天室-實(shí)驗(yàn)報(bào)告_第3頁(yè)
網(wǎng)絡(luò)編程-基于TCP的簡(jiǎn)易聊天室-實(shí)驗(yàn)報(bào)告_第4頁(yè)
網(wǎng)絡(luò)編程-基于TCP的簡(jiǎn)易聊天室-實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩35頁(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)介

網(wǎng)絡(luò)編程課程設(shè)計(jì) -基于TCP的簡(jiǎn)易聊天室一、 實(shí)驗(yàn)基本信息概要1. 題目要求熟悉異步網(wǎng)絡(luò)編程的基本方法,掌握異步網(wǎng)絡(luò)編程和網(wǎng)絡(luò)協(xié)議設(shè)計(jì)的方法。要求采用select模型、WSAAsyncSelect模型、WSAEventSelect模型、重疊模型或完成端口等模型完成編程任務(wù)。2. 上機(jī)要求要求采用select模型、WSAAsyncSelect模型、WSAEventSelect模型、重疊模型或完成端口等模型完成下面的任務(wù)。3. 題目?jī)?nèi)容內(nèi)容概要:實(shí)現(xiàn)一個(gè)聊天室,支持多人聊天。也可以增加私聊等功能。 4. 開(kāi)發(fā)環(huán)境操作系統(tǒng):Windows 7 開(kāi)發(fā)語(yǔ)言:C+集成開(kāi)發(fā)環(huán)境:Microsoft Visual Studio 2010 二、 系統(tǒng)簡(jiǎn)介1. 界面本軟件使用DOS控制臺(tái)界面,界面風(fēng)格較為樸素,沒(méi)用使用復(fù)雜的顏色。但是對(duì)聊天時(shí)界面進(jìn)行了一定的控制和修正使得界面較為美觀,易讀。服務(wù)器:客戶端:2. 軟件功能本軟件實(shí)現(xiàn)了聊天室基本的功能,包括公開(kāi)聊天,私聊,獲取在線用戶,更改昵稱,獲得幫助等。1) 公開(kāi)聊天在光標(biāo)處直接輸入消息后按回車即為發(fā)送公開(kāi)聊天,如下圖所示。2) 私聊使用命令【 /m 對(duì)方UID 消息 】即可發(fā)送私聊,私聊只有對(duì)方可以看到,如下圖所示:客戶端1,密聊UID為132的用戶。發(fā)送后客戶端2,UID為132的用戶收到私聊消息。3) 獲取在線用戶列表使用命令【/list】即可獲得在線用戶列表,用戶列表會(huì)議系統(tǒng)消息的方式返回,如下圖所示。命令發(fā)送后4) 更改昵稱使用命令【/name 你的新昵稱】即可立即更改昵稱,成功修改后服務(wù)器會(huì)以系統(tǒng)消息的方式返回成功修改的提示。命令命令發(fā)送后5) 幫助信息使用命令【/help】即可查看服務(wù)器的歡迎信息,里面包含了該聊天室的使用幫助,如下圖所示。命令命令發(fā)送后3. 系統(tǒng)設(shè)計(jì)開(kāi)發(fā)本軟件時(shí),我使用了面向?qū)ο蟮乃枷?,把服?wù)器和客戶端封裝成對(duì)應(yīng)的類,類設(shè)計(jì)將會(huì)在下一節(jié)做詳細(xì)介紹。通行方面我在服務(wù)器接受客戶端消息,和客戶端接受服務(wù)器消息時(shí)使用了select模型,發(fā)送信息我使用的是普通的socket原語(yǔ)?;驹頌榉?wù)器與客戶端建立TCP連接,然后服務(wù)器負(fù)責(zé)路由消息到各個(gè)客戶端。4. 優(yōu)點(diǎn)與缺點(diǎn)本軟件對(duì)流程復(fù)雜的SELECT模型進(jìn)行了細(xì)致的拆分與抽象,做到了邏輯流程清晰,每個(gè)函數(shù)簡(jiǎn)潔易懂,層次分明。例如服務(wù)器啟動(dòng)函數(shù): 它其實(shí)就完成了一個(gè)簡(jiǎn)單的流程,初始化socket,綁定,監(jiān)聽(tīng),初始化fd_socket集合,死循環(huán)調(diào)用select。通過(guò)合理的封裝底層原語(yǔ)和加入異常處理(異常交給頂層處理),使得代碼專注于業(yè)務(wù)流程而不是繁雜的異常判斷語(yǔ)句,在看下面這個(gè)函數(shù)DoSelect()。它也只完成一個(gè)簡(jiǎn)單的流程,調(diào)用select,然后循環(huán)處理有讀事件的socket。接下來(lái)的DoFDRead()函數(shù)完成的事情也非常直接,如果有事件的socket是監(jiān)聽(tīng)socket的話,那么就是接收到了一個(gè)新的連接,否則是接收到了新的小。從上面這個(gè)簡(jiǎn)單的例子中可以看到,本軟件最大的優(yōu)點(diǎn)就是精心設(shè)計(jì)的類和函數(shù)。避免了使用select模型常見(jiàn)的反復(fù)嵌套的循環(huán)和判斷,每個(gè)函數(shù)清晰明了。本系統(tǒng)還存在以下不足,首先是沒(méi)有對(duì)界面做更深入的優(yōu)化,只是做了最基本的調(diào)整,讓輸入輸出更加雅觀,其次是底層原語(yǔ)的封裝并沒(méi)有考慮到泛用性。三、 系統(tǒng)詳細(xì)設(shè)計(jì)這部分的文檔在編碼之前已經(jīng)基本完成,由于時(shí)間較為倉(cāng)促,部分內(nèi)容可能和實(shí)際有所出入。1. ChatServer類該類負(fù)責(zé)完成服務(wù)器所有操作。1) 類圖2) 成員變量Map m_clients 聊天者的SOCKET與昵稱的映射fd_set m_fdSocket 可用套接字集合fd_set m_fdRead 有事件發(fā)生的套接字集合SOCKET m_sListen 監(jiān)聽(tīng)SocketSOCKET m_sNowClient 當(dāng)前處理的客戶套接字int m_nPort 監(jiān)聽(tīng)端口3) 方法設(shè)計(jì)void Bind()void Listen() void Select()int Recv()SOCKET Accept()封裝底層原語(yǔ),并加入異常機(jī)制,使得外部調(diào)用簡(jiǎn)約明了。構(gòu)造函數(shù)傳入監(jiān)聽(tīng)端口,初始化m_nPortStart()1)初始化監(jiān)聽(tīng)套接字:void InitListenSocket() 2)綁定套接字至本地機(jī)器:void Bind()3)進(jìn)入監(jiān)聽(tīng)模式(設(shè)置為非阻塞):void Listen() 4)初始化可用套接字集合 void InitFDSocket()5)死循環(huán),調(diào)用select方法 DoSelect()6)結(jié)束DoSelect()1)令m_fdRead = m_fdSocket2)調(diào)用Select()3)循環(huán)處理Select的結(jié)果 DoFdRead(Socket sRead)4)結(jié)束DoFdRead(int iReadIndex)1)判斷是否為m_sListen2)是m_sListen RecvNewConnect()3)否則 令m_sNowClient = m_fdReadiReadIndex,調(diào)用RecvNewMessage()RecvNewConnect()1)判斷是否達(dá)到套接字上線2)調(diào)用Accept(),接收連接sClient3)添加sCilent 至 m_fdSocket4)添加套接字至m_clients AddClientToInfoMap(string name)AddClientToInfoMap(string name)1)以SOKCET為鍵,name為值加入MAPRecvNewMessage()1)調(diào)用Recv函數(shù)2)是否為命令 IsCommand(string str)3)是,則DoCommand(string cmd)4)否,則DoMessage(string msg)5)結(jié)束IsCommand(string str)1)判斷是否以 / 開(kāi)頭DoCommand(string cmd)1)判斷指令,并解析命令與參數(shù)(argc, argv)2)調(diào)用指令處理函數(shù)3)假設(shè)只有SetName命令,那么則將對(duì)應(yīng)的套接字的名稱設(shè)置DoMessage(string msg)1)拼接消息與名字 BuildMsg(string msg)2)在服務(wù)器上輸出3)消息路由DispatchMessage(string msg)BuildMsg(string msg)1)從m_clients 中取出用戶昵稱2)拼接字符串,形成格式如下超人君(127.0.0.1) 23:49:48 說(shuō):大家好! 即為:昵稱(IP地址)時(shí)間 說(shuō):消息正文3)返回DispatchMessage(string msg)1)構(gòu)造迭代器2) 遍歷m_clients,若不是自身,則派送消息Send()2. ChatClient 類該類負(fù)責(zé)處理客戶端的所有操作。1) 類圖2) 字段設(shè)計(jì)SOCKET m_sClient客戶端自身的socketSOCKET m_sServer服務(wù)器socketstring m_name昵稱sockaddr_in m_ServerAddr;服務(wù)器地址3) 方法設(shè)計(jì)構(gòu)造函數(shù)根據(jù)端口號(hào)和服務(wù)器IP初始化m_serverConnect()void Select()int Recv()void Send()int Select()封裝底層原語(yǔ),加入異常處理,使得外部調(diào)用節(jié)約優(yōu)雅。void Start()1)初始化套接字 InitClientSocket()2)連接服務(wù)器 Connect() 設(shè)置為非阻塞模式3)獲取名字并發(fā)送至服務(wù)器 InitName()4)創(chuàng)建新線程并顯示替他用戶發(fā)言 線程函數(shù)RecvMsgThread()5)循環(huán) SendMsg()6)關(guān)閉客戶端 CloseClient()InitName()1)提示輸入昵稱2)獲取昵稱3)合法性判斷 判斷重復(fù)4)添加命令格式5)發(fā)送至服務(wù)器SendMsg()1)讀取一行消息2)判斷是否為命令 IsCommand(string str)3)命令:處理命令 DoCommand(string cmd)4)消息:處理消息 DoMessage(string msg)DoMessage(string msg)1)發(fā)送消息 Send()2)本地回顯RecvMsgThread()1) 初始化fdSocket,將m_sClient加入2)創(chuàng)建fdRead3)死循環(huán),將m_sClient拷貝至fdRead4)調(diào)用Select5)循環(huán),并輸出收到的消息 Recv()3. SocketException類該類負(fù)責(zé)記錄SOKCET錯(cuò)誤的代碼以及錯(cuò)誤信息。1) 類圖4. 命令協(xié)議命令格式為 /命令 參數(shù)1 參數(shù)21. 退出: /exit2. 獲取在線用戶列表:/getuser 3. 私聊: /m UID 信息4. 清屏:/clear5. 幫助:/help處理方式IsCommand(string str) 負(fù)責(zé)解析是否為命令判斷首字母是否為斜杠/ str.at(0) = /ResoveCommand(string cmd, int& argc, string argv) 若是命令將命令解析為argc,argvDoCommand(string cmd) 處理命令,調(diào)用具體的XXX命令處理函數(shù)DoCmdXXXX()。5. 消息格式1) 公共消息超人君(127.0.0.1) UID:100 說(shuō):大家好!李四(127.0.0.1) UID:101 說(shuō):你好!2) 私聊你悄悄地對(duì) ABC UID:100 說(shuō): 你好CDF UID:101 悄悄地對(duì)你說(shuō): 你好3) 服務(wù)器消息【系統(tǒng)消息】XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。4) 程序內(nèi)部提示System Infoxxxxxxxxxxxxxxxxxxxxxxxxx四、 系統(tǒng)測(cè)試1. 服務(wù)器使用錯(cuò)誤2. 客戶端使用錯(cuò)誤3. 啟動(dòng)服務(wù)器5. 啟動(dòng)客戶端客戶端出現(xiàn)歡迎信息以及昵稱輸入提示。服務(wù)器出現(xiàn)連接提示6. 關(guān)閉客戶端服務(wù)器出現(xiàn)斷開(kāi)連接提示7. 啟動(dòng)服務(wù)器錯(cuò)誤提示給出錯(cuò)誤提示信息和提示代碼8. 公開(kāi)聊天所有客戶端以及服務(wù)器都會(huì)顯示。9. 私聊只有私聊的二人才能看到聊天信息,其他用戶和服務(wù)器無(wú)法看到。10. 錯(cuò)誤的私聊私聊自己會(huì)得到一個(gè)錯(cuò)誤提示私聊不存在的用戶也會(huì)得到一個(gè)錯(cuò)誤提示11. 更名12. 獲取在線用戶13. 幫助14. 非法指令非法指令會(huì)給出錯(cuò)誤提示。15. 非法的指令參數(shù)16. 連接服務(wù)器失敗五、心得體會(huì)這次實(shí)現(xiàn)我深入研究了select模型的使用,完成了一個(gè)簡(jiǎn)易的聊天室。這次試驗(yàn)也使我在編程技巧方面也有了很大的提高。六、完整代碼Charserverd.cpp 服務(wù)器main函數(shù)文件#include ChatServer.h#include SockException.h#include InitSock.h#include using namespace std;InitSock initSock;int main(int argc, char* argv)if (argc 2)cout Usage: argv0 Port endl;return 1;ChatServer charServer(atoi(argv1);trycharServer.Start();catch (SockException& e)cout e.GetErrorInfo() endl;cout System ErrorError Code: e.GetErrorCode() endl;ChatServer.h 服務(wù)器類頭文件#ifndef CHAT_SERVER_H#define CHAT_SERVER_H#include #include #include #include ClientInfo.husing namespace std;class ChatServerpublic:void Start();void End();ChatServer(int nPort);ChatServer(void);private:void InitFDSocket();void DoSelect();void DoFDRead(SOCKET sRead);void RecvNewConnect();string IPAddrToString(sockaddr_in sin);void AddClientToInfoMap(ClientInfo info);void RecvNewMessage();bool IsCommand(string str);void DoCommand(string cmd);void ResoveCommand(string cmd, int& argc, string argv);void DoCmdName(int argc, string argv);void DoCmdGetUsers(int argc, string argv);void DoMessage(string msg);void DoCmdPrivateMsg(int argc, string argv);string BuildMessage(string str, bool bIsPublic);string BuildSystemMsg(string str);void DispatchMessage(string msg); void CloseConnect();string IntToString(int nNum);/=簡(jiǎn)單封裝底層原語(yǔ)=void InitListenSocket();void Bind();void Listen() ;int Select();int Recv(char msgBuff);void Send(string msg, SOCKET client);SOCKET Accept(sockaddr_in& sin);/=private:map m_clients; fd_set m_fdSocket; fd_set m_fdRead;SOCKET m_sListen; SOCKET m_sNowClient; int m_nPort; ;#endif CHAT_SERVER_HChatServer.cpp 服務(wù)器類#include #include #include ChatServer.h#include SockException.h#pragma comment(lib, ws2_32.lib)using namespace std;#define MAX_BUFF_SIZE 500typedef map:iterator map_it;ChatServer:ChatServer(int nPort)this-m_nPort = nPort;void ChatServer:Start()InitListenSocket();Bind();Listen();InitFDSocket();while (true)DoSelect();void ChatServer:DoSelect()m_fdRead = m_fdSocket;int nRet = Select();if (nRet 0)for (int i = 0; i = FD_SETSIZE)cout System Info接受連接達(dá)到上限,拒絕連接 endl;return;sockaddr_in clientAddr;m_sNowClient = Accept(clientAddr);ClientInfo clientInfo(clientAddr);cout System Info接受來(lái)自 clientInfo.GetIp() 的連接 endl;FD_SET(m_sNowClient, &m_fdSocket);AddClientToInfoMap(clientInfo);string ChatServer:IPAddrToString(sockaddr_in sin)string str = inet_ntoa(sin.sin_addr);str.append(:);char szFormat20; str.append(ltoa( ntohs(sin.sin_port),szFormat,10);return str;void ChatServer:AddClientToInfoMap(ClientInfo info)m_clientsm_sNowClient = info;void ChatServer:RecvNewMessage()char msgBuffMAX_BUFF_SIZE;int nRet = Recv(msgBuff);string msg(msgBuff);if (nRet = 0) return;if (IsCommand(msg)DoCommand(msg);elseDoMessage(msg);void ChatServer:DoCommand(string cmd)int argc;string argv100;ResoveCommand(cmd, argc, argv);if (argv0 = name)DoCmdName(argc, argv);else if (argv0 = list)DoCmdGetUsers(argc, argv);else if(argv0 = m)DoCmdPrivateMsg(argc, argv);elseSend(【系統(tǒng)消息】命令不存在,請(qǐng)使用 /help 命令查看命令幫助, m_sNowClient);void ChatServer:ResoveCommand(string cmd, int& argc, string argv)int count = 0;for(int i = 1; i second.GetName() + + begin-second.GetIp();msg.append( UID: + IntToString(int)begin-first);msg.append(nr);Send(msg, m_sNowClient);void ChatServer:DoCmdName(int argc, string argv)if (argc != 2)Send(【系統(tǒng)消息】命令格式錯(cuò)誤 USAGE: /name 你的昵稱, m_sNowClient);return;string name = argv1;m_clientsm_sNowClient.SetName(name);Send(【系統(tǒng)消息】昵稱已修改為: + name, m_sNowClient);void ChatServer:DoMessage(string str)string msg = BuildMessage(str, true);cout msg endl;DispatchMessage(msg);/*string ChatServer:BuildMssage(string str)ClientInfo info = m_clientsm_sNowClient;string name = info.GetName();string ip = info.GetIp();string msg = name;if (name != ip)msg.append( + ip + );char buff10;string id(itoa(int)m_sNowClient, buff, 10);msg.append( UID: + id);msg.append( 說(shuō):);msg.append(nr );msg.append(str);return msg;*/string ChatServer:BuildSystemMsg(string str)string msg(【系統(tǒng)消息】);msg.append(str);return msg;string ChatServer:BuildMessage(string str, bool bIsPublic)ClientInfo info = m_clientsm_sNowClient;string name = info.GetName();string ip = info.GetIp();string uid = IntToString(int)m_sNowClient);string msg(name);if (ip != name & bIsPublic = true)msg.append( + ip + );msg.append( );msg.append(UID: + uid);msg.append( );bIsPublic ? msg.append(說(shuō):) : msg.append(悄悄地對(duì)你說(shuō):);msg.append(nr);msg.append( );msg.append(str);return msg;void ChatServer:DoCmdPrivateMsg(int argc, string argv)if (argc first = m_sNowClient)Send(【系統(tǒng)消息】您不能和自己私聊, m_sNowClient);return;string name = it-second.GetName();string uid = IntToString(s);string toDest = BuildMessage(, false);string toSrc = string(你悄悄地對(duì) + name + UID: + uid + 說(shuō):nr );string other;for (int i = 2; i first);bool ChatServer:IsCommand(string str)if (str.at(0) = /)return true;elsereturn false;void ChatServer:CloseConnect()cout System Info來(lái)自 m_clientsm_sNowClient.GetIp() 的連接已斷開(kāi) endl;closesocket(m_sNowClient);FD_CLR(m_sNowClient,&m_fdSocket);void ChatServer:InitFDSocket()FD_ZERO(&m_fdSocket);FD_SET(m_sListen, &m_fdSocket);void ChatServer:InitListenSocket()m_sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (m_sListen = INVALID_SOCKET)throw SockException(System Error創(chuàng)建套接字失敗:);void ChatServer:Bind()sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_addr.S_un.S_addr = INADDR_ANY;sin.sin_port = htons(m_nPort);if (bind(m_sListen, (sockaddr*)&sin, sizeof(sin) )= SOCKET_ERROR)throw SockException(System Error無(wú)法綁定端口);elsecout System Info成功綁定端口: m_nPort endl;void ChatServer:Listen()if (listen(m_sListen, 10) = SOCKET_ERROR)throw SockException(System Error服務(wù)器監(jiān)聽(tīng)端口失敗);elsecout System Info服務(wù)器在 m_nPort 端口開(kāi)始監(jiān)聽(tīng) endl;u_long value = 1;if (ioctlsocket(m_sListen, FIONBIO, &value)throw SockException(System Error設(shè)置服務(wù)器為非阻塞模式失敗);int ChatServer:Select()int nRet = select(0, &m_fdRead, NULL, NULL, NULL);if (nRet = SOCKET_ERROR)throw SockException(System Error調(diào)用SELECT原語(yǔ)失敗);elsereturn nRet;SOCKET ChatServer:Accept(sockaddr_in& sin)int nLen = sizeof(sin);SOCKET sNew = accept(m_sListen, (sockaddr*)&sin, &nLen);if (sNew = INVALID_SOCKET)throw SockException(System Error調(diào)用ACCEPT原語(yǔ)接受連接失敗);return sNew;int ChatServer:Recv(char msgBuff)int nRet = recv(m_sNowClient, msgBuff, MAX_BUFF_SIZE, 0);if (nRet = SOCKET_ERROR)CloseConnect();return 0;elsemsgBuffnRet = 0;return nRet;void ChatServer:Send(string msg, SOCKET client)if (send(client, msg.c_str(), msg.size(), 0) = SOCKET_ERROR)string errorIp = m_clientsclient.GetIp();throw SockException(System Error發(fā)送信息 + msg + 至 + errorIp + 失敗);string ChatServer:IntToString(int nNum)char buff10;string str(itoa(nNum, buff, 10);return str;ChatServer:ChatServer(void)ClientInfo.h 客戶信息類#include using namespace std;class ClientInfopublic:ClientInfo()ClientInfo(string ip, int port, string name)this-ip = ip;this-port = port;this-name = name;ClientInfo(sockaddr_in sin)ip = inet_ntoa(sin.sin_addr);/port = ntohs(sin.sin_port);name = ip;/name.append(:);/char szFormat20; /name.append(ltoa( ntohs(sin.sin_port),szFormat,10);string GetIp()return ip;string GetName()return name;int GetPort()return port;void SetName(string name)this-name = name;private:string name;string ip;int port;Charclientd.cpp 客戶端main函數(shù)#include SockException.h#include InitSock.h#include #include ChatClient.husing namespace std;InitSock initSock;int main(int argc, char* argv)tryif (argc 3)cout Usage: argv0 Ip Port endl;return 1;ChatClient client(argv1,atoi(argv2);client.Start();catch (SockException& e)cout e.GetErrorInfo() endl;cout System ErrorError Code: e.GetErrorCode() endl;ChatClient.h 客戶端頭文件#ifndef CHAT_CLIENT_H#define CHAT_CLIENT_H#include #include using namespace std;class ChatClientpublic:ChatClient(string addr, int nPort);ChatClient(void);void Start();void End();SOCKET GetClientSock();private:void Connect();int Recv();void Send(string msg);int Select();void InitClientSocket();string IPAddrToString(sockaddr_in sin);void Welcome();void SendMsg();void InitName();bool IsCommand(string str);void DoMessage(string msg);void DoCommand(string cmd);void ResoveCommand(string cmd, int& argc, string argv);string GetLine();private:string m_name;SOCKET m_sClient;SOCKET m_sServer;sockaddr_in m_serverAddr;#endif CHAT_CLIENT_HChatClient.cpp 客戶端類#include #include #include #include #include ChatClient.h#include SockException.h#pragma comment(lib, ws2_32.lib)#define MAX_BUFF_SIZE 500using namespace std;void RecvMsgThread(void * param);ChatClient:ChatClient(string addr, int nPort)m_serverAddr.sin_addr.S_un.S_addr = inet_addr(addr.c_str();m_serverAddr.sin_port = htons(nPort);m_serverAddr.sin_family = AF_INET;ChatClient:ChatClient(void)void ChatClient:Start()InitClientSocket();Connect();Welcome();Sleep(1000);InitName();_beginthread(RecvMsgThread,NULL,(void*)this); while (true)SendMsg();void ChatClient:Welcome()co

溫馨提示

  • 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)論