VC实现聊天室软件

上传人:仙*** 文档编号:61175977 上传时间:2022-03-10 格式:DOC 页数:25 大小:202.50KB
收藏 版权申诉 举报 下载
VC实现聊天室软件_第1页
第1页 / 共25页
VC实现聊天室软件_第2页
第2页 / 共25页
VC实现聊天室软件_第3页
第3页 / 共25页
资源描述:

《VC实现聊天室软件》由会员分享,可在线阅读,更多相关《VC实现聊天室软件(25页珍藏版)》请在装配图网上搜索。

1、网络程序设计课程设计报告书题 目:_专 业:_题目及要求1、简单的聊天室程序本题是一个简单的聊天室程序,采用客户/服务器模式,分为客户端程序和 服务器端程序。由于服务器只能支持一个客户, 实际上是一个点对点通信的程序。 客户端程序和服务器程序通过网络交换聊天字符串内容, 并在窗口的列表框中显 示。本实例程序的技术要点是:如何从Casy ncSocket类派生出自己的Win Sock类。理解WinSock类与应用程序框架的关系。 重点学习流式套接字对象的使用。 处理网络事件的方法。二,需求分析2.1设计目的综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序, 以VisualC+乍为开

2、发平台,通过实践复习巩固课堂所学的理论知识,提高对所学 知识的综合应用能力。2.2设计要求采用客户/服务器模式,分为客户端程序和服务器端程序。服务器采用WINSOCIK/O模型中的任一种,支持多个客户同时在线聊天。客户端程序和服务 器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用 户,支持客户端之间的私聊(可以通过服务器中转,或考虑UDP丁洞直接建立端 端连接)。课程设计要求设计并编程完成两个方面的内容:首先建立一个使用TCP协 议的聊天室服务器, 这个服务器可以同时支持多个用户的在线聊天; 其次设计一 个可以和服务器通信的聊天室客户端。2.3功能要求支持多个客户端的连接,

3、在服务器和多个客户端之间进行数据传输;接收客户端发送的消息,并显示在一个列表框中; 在用户连接上后有提示,显示出连接的用户名字; 发送信息时可以显示聊天的所有记录;2.4系统主要功能和主要功能描述:服务器端聊天程序必须能够做3件事情:(1) 服务器聊天程序要在待定的端口上等待来自聊天客户的连接请求, 并且需 要维护一个客户连接表,以记录所有成功的连接。(2) 服务器聊天程序要及时接受从各个聊天客户发送过来的信息, 然后把这些 信息转发到一个或多个客户连接。 对于公共聊天室, 服务器将把接受到的 信息向除源端外的所有客户发送过去。(3) 服务器还要监控这些连接的状态, 在客户主动离开或发生故障时

4、从列表中 删除相应的表项,并及时更新连接表。这些要求可以通过CSocket类提供的功能实现。从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与 客户的连接。服务器只需要一个侦听套接字CListenSocket,然后根据客户的连 接请求动态创建客户套接字CClientSocket。客户套接字的数量是不可预知的, 因此需要一个列表来记录。MFC的CPtrList类就能实现这种功能。客户端聊天程序需要完成以下几个功能:(1) 客户端聊天程序要负责建立和维护与服务器的连接,通过获取用户的设 置尝试与服务器的连接,并且随时检测连接的

5、状态。(2) 客户端聊天程序要把用户输入的信息及时发送到聊天服务器。一般情况 下,当用户输入一行信息并且按下回车键后聊天程序就要把这一行信息 发送出去,才能及时地满足用户的交互需求。(3) 要随时准备好接受来自服务器的信息,随时把接受到的信息显示出来, 让用户及时看到对方的响应。(4) 在用户退出聊天过程是要关闭与服务器的连接。比较好的做法是提前通知服务器或者直接给服务器发送一条退出通知,使得服务器能够及时掌握客户端的连接状态,把对方客户的退出信息及时发送到对等实体上。客户端聊天程序需要使用一个通过CSocket类派生出来的CChatSocket类来 实现。该套接字用来发送一个与服务器的连接请

6、求和维持与服务器的连接,发 送和接收聊天信息,完成上述各项功能。3设计流程图根据对用户的要求及功能设置可以得到以下的流程图3.1,用户首先启动客 户端,登陆服务器并向服务器发送信息,启动服务器,服务器等待客户要求并 向客户反馈在线用户信息,用户向服务器发送信息,服务器处理用户的数据, 然后用户开始聊天。客户端的聊天分为对所有人的信息和私聊的信息,该信息 应通过程序控制分别进行处理。图3.1设计流程图5设计的总结和体会该次课程设计的制作我主要是参照了图书馆内的相关书籍, 找到一个类似的 程序,然后按照书上的内容一步步的做出来了, 虽然这个程序算不上是我自己写 出来的,但通过这样的一个过程, 还是

7、让我学会了很多东西, 也算能比较熟练地 掌握MFC这一个软件了,这算是一个不小的收获吧,而且,在做这个程序的过 程中,让我认识到了在做这样程序中, 遇到解决不了的问题与同学的讨论时很重 要的,譬如可以以运行, 但是就是无法出现连接的显示和状态。 最后与同学讨论 后,才知道是服务器端有了错误,没有设置自己的IP地址,然后对于客户端进 行了一番修改, 才终于出现了上述的结果。 虽然没有彻底做的出来, 但是还是比 较开心的,因为自己知道了哪里不足, 哪里不可以, 可以在以后多多的做练习来 充实自己。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的 哲理,懂得怎么样去制定计划, 怎么样

8、去实现这个计划, 并掌握了在执行过程中 怎么样去克服心理上的不良情绪。 因此在以后的生活和学习的过程中, 我一定会 把课程设计的精神带到生活中,不畏艰难,勇往直前!我以后还是需要多多的练习, 多多的勤奋, 这样才有可能让自己有信心, 有 动力,让自己不至于懂的太少而怯场, 因为不懂而不会做, 相信自己以后会编写 出让自己满意的程序和软件的。附:源代码I服务器:/ ServerDlg.cpp : implementation file/#include stdafx.h#include Server.h#include ServerDlg.h#ifdef _DEBUG#define new DE

9、BUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif / CAboutDlg dialog used for App About class CAboutDlg : public CDialogpublic:CAboutDlg();protected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(

10、pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()/ CServerDlg dialogCServerDlg:CServerDlg(CWnd* pParent /*=NULL*/): CDialog(CServerDlg:IDD, pParent)m_hIcon = AfxGetApp()-LoadIcon(IDI_ICONAPP);void CServerDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Control(pDX, IDC

11、_LIST_USER, m_lbUser);DDX_Text(pDX, IDC_EDIT_DISPLAY , m_strDisplay);BEGIN_MESSAGE_MAP(CServerDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BN_START, OnBnStart)ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose)ON_MESSAGE(WM_RECEIVE, OnReceive)ON_MESSAGE(WM_CLIENTCLOSE, OnCli

12、entClose)ON_MESSAGE(WM_ACCEPT, OnAccept)ON_WM_DESTROY()END_MESSAGE_MAP()/ CServerDlg message handlersBOOL CServerDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX & 0 xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutM

13、enu);SetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FALSE);/ Set small iconm_iNetPort = 3127;m_Server.Initialize(this);m_bServer = FALSE;GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE);return TRUE; / return TRUE unless you set the focus to a controlvoid CServerDlg:OnSysCommand(UINT nID, LPARAM

14、lParam)if (nID & 0 xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CServerDlg:OnPaint()if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM)0);int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon =

15、GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2; dc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();HCURSOR CServerDlg:OnQueryDragIcon()dc.GetSafeHdc(),return (HCURSOR) m_hIcon;void CServerDlg:OnBnStart()/创建套接

16、字m_Server.Create(m_iNetPort);/开始监听m_Server.Listen();/显示CString strInfo;strInfo.LoadString(IDS_CREATE_SERVER);ShowInDisplay(strInfo);m_bServer = TRUE;GetDlgItem(IDC_BN_START)-EnableWindow(FALSE);GetDlgItem(IDC_BN_CLOSE)-EnableWindow(TRUE);void CServerDlg:OnBnClose()CloseServer();GetDlgItem(IDC_BN_STA

17、RT)-EnableWindow(TRUE);GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE);void CServerDlg:OnAccept()/创建新客户CMySocket *pNewClient = new CMySocket;pNewClient-Initialize(this);m_Server.Accept(*pNewClient);/放入链表中m_lsClient.AddTail(pNewClient);void CServerDlg:OnClientClose(WPARAM wParam, LPARAM lParam)CMySocket

18、 *p_delClient = (CMySocket*)wParam;/关闭该用户p_delClient-ShutDown();char bufferBUFFERSIZE;while(p_delClient-Receive(buffer, BUFFERSIZE)0); p_delClient-Close();/在用户链表中删除该用户POSITION psCur, psList = m_lsClient.GetHeadPosition();CMySocket *p_curClient;while(psList!=NULL)psCur = psList;p_curClient = (CMySock

19、et *)m_lsClient.GetNext(psList);if(p_delClient=p_curClient)m_lsClient.RemoveAt(psCur);break;/发送信息告诉其他用户该客户退出CString strMsg; strMsg.LoadString(IDS_CLIENT_CLOSE);NETMESSAGE netMessage(PTC_CLIENT_QUIT, p_delClient-GetName(),_T(), p_delClient-GetName() + strMsg);SendToAllClient(netMessage);/界面上清理该用户信息m_

20、lbUser.DeleteString(m_lbUser.FindString(-1, p_delClient-GetName();ShowInDisplay(p_delClient-GetName() + strMsg);/删除该用户delete p_delClient;void CServerDlg:OnReceive(WPARAM wParam, LPARAM lParam)CMySocket *p_curClient = (CMySocket*)wParam;NETMESSAGE netMessage;p_curClient-Receive(char *)&netMessage, si

21、zeof(netMessage);switch(netMessage.type)case PTC_NEW: /新客户加入NewClientAdd(p_curClient, &netMessage);break;case PTC_SAY: /普通聊天ShowMessage(netMessage);break;/把加工过的信息发送给其他用户SendToAllClient(netMessage);void CServerDlg:CloseServer()if(!m_bServer) return;/向所有客户发送服务端关闭的信息CString strInfo; strInfo.LoadString(

22、IDS_CLOSESERVER);NETMESSAGEnetMessage(PTC_SYSTEM,_T(),_T(),strInfo);SendToAllClient(netMessage);/服务端界面显示关闭信息ShowInDisplay(strInfo);/关闭服务端m_Server.Close();/关闭客户端char bufferBUFFERSIZE;CMySocket *m_pClient;POSITION psList = m_lsClient.GetHeadPosition();while(psList!=NULL)m_pClient = (CMySocket *)m_lsCl

23、ient.GetNext(psList);m_pClient-ShutDown();while(m_pClient-Receive(buffer, BUFFERSIZE)0);m_pClient-Close();delete m_pClient;m_lsClient.RemoveAll();m_bServer = FALSE;/向所有户发出信息void CServerDlg:SendToAllClient(const NETMESSAGE &netMessage)CMySocket *m_pClient;POSITION psList = m_lsClient.GetHeadPosition(

24、);while(psList!=NULL)m_pClient = (CMySocket *)m_lsClient.GetNext(psList);m_pClient-SendMsg(netMessage);void CServerDlg:ShowInDisplay(CString str)m_strDisplay += str + rn;UpdateData(false);void CServerDlg:OnDestroy()CDialog:OnDestroy();/ TODO: Add your message handler code here/新用户加入void CServerDlg:N

25、ewClientAdd(CMySocket *p_client, NETMESSAGE*netMessage)/存入用户名字p_client-SetName(netMessage-form);/在列表框中显示该用户m_lbUser.AddString(p_client-GetName();/发送用户列表给该客户NETMESSAGE netMsg(PTC_USER_LIST, _T(), _T(), _T();int iListLen = m_lbUser.GetCount();CString strMsg;for(int index=m_lbUser.GetTopIndex(); indexS

26、endMsg(netMsg);/加工信息strMsg.LoadString(IDS_NEW_CLIENT); strMsg = p_client-GetName() + strMsg;strcpy(netMessage-data, (LPCTSTR)strMsg);/显示该用户进入ShowInDisplay(strMsg);/显示普通消息void CServerDlg:ShowMessage(NETMESSAGE netMessage)CString strTo = netMessage.to;if(strTo=_T()strTo = 所有人;CString strForm = netMess

27、age.form;CString strMsg = netMessage.data;CString strOut = strForm + 对 + strTo + 说: + strMsg;ShowInDisplay(strOut);II客户端:/ ClientDlg.cpp : implementation file/#include stdafx.h#include Client.h#include ClientDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif

28、/ CAboutDlg dialog used for App About class CAboutDlg : public CDialogpublic:CAboutDlg(); enum IDD = IDD_ABOUTBOX ;protected:virtual void DoDataExchange(CDataExchange* pDX);protected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/ DDX/DDV supportvoid CAboutDlg:DoDataExchange(CD

29、ataExchange* pDX)CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP()/ CClientDlg dialog CClientDlg:CClientDlg(CWnd* pParent /*=NULL*/): CDialog(CClientDlg:IDD, pParent)m_strDisplay = _T(); m_strSend = _T(); m_bWhispering = FALSE;m_hIcon = AfxGetApp()-LoadIcon(IDR_MAIN

30、FRAME);void CClientDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST_USER, m_lbUser); DDX_Text(pDX,IDC_EDIT_DIAPLAY , m_strDisplay); DDX_Text(pDX, IDC_EDIT_SEND,m_strSend);DDX_Check(pDX, IDC_CHECK_WHISPERING , m_bWhispering);BEGIN_MESSAGE_MAP(CClientDlg, CDi

31、alog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BN_CONNECT, OnBnConnect)ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose)ON_BN_CLICKED(IDC_BN_SEND, OnBnSend)ON_MESSAGE(WM_RECEIVE, OnReceive)ON_MESSAGE(WM_SOCKETCLOSE, OnServerClose)ON_MESSAGE(WM_SEND, OnSend) ON_MESSAGE(WM_CONNCET,OnC

32、onnect) ON_LBN_DBLCLK(IDC_LIST_USER, OnDblclkListUser)END_MESSAGE_MAP() / CClientDlg message handlersBOOL CClientDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX & 0 xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX,strAboutMe

33、nu);SetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/参数初始化m_Socket.Initialize(this);m_strNetIP = _T(127.0.0.1);m_iNetPort = 3127;m_bConnect = FALSE;GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE);GetDlgItem(IDC_BN_SEND)-EnableWindow(FALSE);return TRUE; / return TRUE unless

34、 you set the focus to a controlvoid CClientDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0 xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CClientDlg:OnPaint()if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICON

35、ERASEBKGND, (WPARAM)0);int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2; dc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();HCURSOR CClientDlg:OnQueryDragIc

36、on()return (HCURSOR) m_hIcon;void CClientDlg:OnBnConnect()CString strConnectError;/获取用户名字CInputDlg inputDlg;int iResult = inputDlg.DoModal(); if(iResult=IDCANCEL)return; m_strName =inputDlg.m_strName;/创建套接字if(!m_Socket.Create()strConnectError.LoadString(IDS_FAIL_CREATE_SOCKET);dc.GetSafeHdc(),ShowIn

37、Display(strConnectError);return;CString strInfo;strInfo.LoadString(IDS_CONNECTING); ShowInDisplay(strInfo);/连接服务器if(!m_Socket.Connect(m_strNetIP, m_iNetPort)int n = m_Socket.GetLastError();strConnectError.LoadString(IDS_FAIL_CONNECT);ShowInDisplay(strConnectError);return;strInfo.LoadString(IDS_SUCCE

38、ED_CONNECT); ShowInDisplay(strInfo);m_bConnect = TRUE;/发送自已的名字NETMESSAGE netMessage(PTC_NEW, m_strName, _T(), _T();m_Socket.SendMsg(netMessage);GetDlgItem(IDC_BN_CONNECT)-EnableWindow(FALSE);GetDlgItem(IDC_BN_CLOSE)-EnableWindow(TRUE);GetDlgItem(IDC_BN_SEND)-EnableWindow(TRUE);void CClientDlg:OnBnCl

39、ose()if(m_bConnect)m_Socket.Close();m_bConnect = FALSE;GetDlgItem(IDC_BN_CONNECT)-EnableWindow(TRUE);GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE);GetDlgItem(IDC_BN_SEND)-EnableWindow(FALSE);m_lbUser.ResetContent();CString strMsg;strMsg.LoadString(IDS_BREAK);ShowInDisplay(strMsg);void CClientDlg:OnBn

40、Send()OnSend();m_strSend = _T();UpdateData(FALSE);void CClientDlg:OnReceive()NETMESSAGE netMessage;m_Socket.Receive(char *)&netMessage, sizeof(netMessage);CString strForm = netMessage.form;/过滤自已发出的信息if(strForm=m_strName) return;CString strTo = netMessage.to;CString strMsg = netMessage.data;switch(ne

41、tMessage.type)case PTC_USER_LIST: /用户列表m_lbUser.AddString(strMsg);break;case PTC_NEW: /新用户进入m_lbUser.AddString(strForm);ShowInDisplay(strMsg);break;case PTC_SAY: ShowMessage(netMessage);case PTC_WHISPERING: /密语if(strTo!=m_strName) return;ShowMessage(netMessage);break;case PTC_CLIENT_QUIT: /有用户退出m_lb

42、User.DeleteString(m_lbUser.FindString(-1, strForm);ShowInDisplay(strMsg);break;void CClientDlg:OnServerClose()if(!m_bConnect) return;CString strMsg;strMsg.LoadString(IDS_SERVER_CLOSE);ShowInDisplay(strMsg);m_Socket.Close();m_bConnect = FALSE;GetDlgItem(IDC_BN_CONNECT)-EnableWindow(TRUE);GetDlgItem(I

43、DC_BN_CLOSE)-EnableWindow(FALSE);GetDlgItem(IDC_BN_SEND)-EnableWindow(FALSE);m_lbUser.ResetContent();void CClientDlg:OnSend()UpdateData(TRUE);/主要是填充NETMESSAGE结构体NETMESSAGE netMessage;strcpy(netMessage.form, m_strName);strcpy(netMessage.data, m_strSend);/取得列表框中的用户if(m_lbUser.GetText(m_lbUser.GetCurSe

44、l(), netMessage.to)=LB_ERR)strcpy(netMessage.to, _T();if(m_bWhispering)/密语CString strTo = netMessage.to;if(strTo=_T()MessageBox(请选择对方!,错误);return;netMessage.type = PTC_WHISPERING;elsestrcpy( netMessage.to, _T (所有人);netMessage.type = PTC_SAY;/发送该信息m_Socket.SendMsg(netMessage);/显示发送信息CString strTo = n

45、etMessage.to;CString strMsg = netMessage.data;Showl nDisplay(你对+ strTo + 说:+ strMsg);void CClientDlg:ShowlnDisplay(CString str)m_strDisplay += str + rn;UpdateData(FALSE);void CClientDlg:ShowMessage(const NETMESSAGE &netMessage)CString strTo = netMessage.to;if(strTo=_T()strTo = 所有人;else if(strTo=m_st

46、rName)strTo = 你;CString strForm = netMessage.form;CString strMsg = netMessage.data;CString strOut = strForm + 对 + strTo + 说: + strMsg;ShowInDisplay(strOut);void CClientDlg:OnDblclkListUser()/ TODO: Add your control notification handler code herem_lbUser.SetCurSel(-1);void CClientDlg:OnConnect()m_bConnect = TRUE;指导教师评语:成绩:指导教师:年月日

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!