2022年网络编程课程设计聊天室程序设计 .pdf

上传人:H****o 文档编号:33398110 上传时间:2022-08-10 格式:PDF 页数:20 大小:599.14KB
返回 下载 相关 举报
2022年网络编程课程设计聊天室程序设计 .pdf_第1页
第1页 / 共20页
2022年网络编程课程设计聊天室程序设计 .pdf_第2页
第2页 / 共20页
点击查看更多>>
资源描述

《2022年网络编程课程设计聊天室程序设计 .pdf》由会员分享,可在线阅读,更多相关《2022年网络编程课程设计聊天室程序设计 .pdf(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、网络编程课程设计题目:简单的聊天室程序专业:计算机网络班级:网络一班时间:2011.5.05名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 20 页 - - - - - - - - - 2 目 录摘要3 一 设计内容 .3 1、设计目的 3 2、设计要求 3 二 设计原理 3 三 设计过程 .4 1、程序设计流程及源代码.4 (1)流程图 .4 (2)源代码 .4 I 服务器 4 II 客户端 .9 2、 调试分析过程描述 14 3、 结果分析 19 结论. .20 参考

2、文献 . .20 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 20 页 - - - - - - - - - 3 摘要 当今世界正处于信息时代,计算机和通信网络是这一时代所谓“信息基础设施” 。在互联网相当普及的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。 聊天室程序可以说是网上最简单的多点通信程序。一个简单的聊天室, 从程序员的观点来看就是在多个I/O端点之间实现多对多的通信。基于SOCKET 的局域网通信是一种灵活的、易于实现的、低成本的方法。它可以运行

3、在各种使用 TCP/IP 协议作为通讯协议的网络上。而在SOCKET API 的帮助下,开发基于 SOCKET 的局域网通信软件也是易于实现的。 正文 一、设计内容1、设计的目的综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以Visual C+ 作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。2、设计要求采用客户 / 服务器模式,分为客户端程序和服务器端程序。服务器采用WINSOCK I/O 模型中的任一种,支持多个客户同时在线聊天。客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊 (

4、可以通过服务器中转, 或考虑 UDP打洞直接建立端端连接) 。二、设计原理服务器端通过 socket() 系统调用创建一个Socket 数组后 (即设定了接受连接客户的最大数目),与指定的本地端口绑定bind() ,就可以在端口进行侦听listen() 。如果有客户端连接请求,则在数组中选择一个空Socket ,将客户端地址赋给这个Socket 。然后登录成功的客户就可以在服务器上聊天了。客户端程序相对简单, 只需要建立一个Socket 与服务器端连接, 成功后通过这个Socket名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -

5、名师精心整理 - - - - - - - 第 3 页,共 20 页 - - - - - - - - - 4 来发送和接收数据就可以了。socket 聊天室基本原理是,抛开CGI(公共网关接口)和 www 服务器,根据 html 规范,接收到浏览器的请求以后,模仿www服务器的响应, 将聊天内容发回浏览器。 在浏览器看来就像浏览一个巨大的页面一样始终处于页面联接状态,这就是一个专门的聊天服务器,一个简化了的www 服务器。三、设计过程1、程序设计流程及源代码(1)流程图(2)源代码I 服务器:/ ServerDlg.cpp : implementation file / #include std

6、afx.h #include Server.h #include ServerDlg.h #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE = _FILE_; #endif / / CAboutDlg dialog used for App About class CAboutDlg : public CDialog public: CAboutDlg(); protected: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名

7、师精心整理 - - - - - - - 第 4 页,共 20 页 - - - - - - - - - 5 DECLARE_MESSAGE_MAP() ; CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD) void CAboutDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() / / CServerDlg dialog CServerDlg:CServerD

8、lg(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_LIST_USER, m_lbUser); DDX_Text(pDX, IDC_EDIT_DISPLAY, m_strDisplay); BEGIN_MESSAGE_MAP(CSer

9、verDlg, 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, OnClientClose) ON_MESSAGE(WM_ACCEPT, OnAccept) ON_WM_DESTROY() END_MESSAGE_MAP() / / CSer

10、verDlg message handlers BOOL CServerDlg:OnInitDialog() CDialog:OnInitDialog(); ASSERT(IDM_ABOUTBOX & 0 xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARA TOR); pSysMenu-AppendMenu(MF_STRING , IDM_ABOUTBOX, strAboutMenu); SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); /

11、 Set small icon m_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 control void CServerDlg:OnSysCommand(UINT nID, LPARAM lParam) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -

12、 - 名师精心整理 - - - - - - - 第 5 页,共 20 页 - - - - - - - - - 6 if (nID & 0 xFFF0) = IDM_ABOUTBOX) CAboutDlg dlgAbout; dlgAbout.DoModal(); else CDialog:OnSysCommand(nID, lParam); void CServerDlg:OnPaint() if (IsIconic() CPaintDC dc(this); / device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM

13、) dc.GetSafeHdc(), 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); else CDialog:OnPaint(); HCURSOR CServerDlg:OnQue

14、ryDragIcon() return (HCURSOR) m_hIcon; void CServerDlg:OnBnStart() / 创建套接字m_Server.Create(m_iNetPort); / 开始监听m_Server.Listen(); / 显示CString strInfo; strInfo.LoadString(IDS_CREA TE_SERVER); ShowInDisplay(strInfo); m_bServer = TRUE; GetDlgItem(IDC_BN_START)-EnableWindow(FALSE); GetDlgItem(IDC_BN_CLOSE

15、)-EnableWindow(TRUE); void CServerDlg:OnBnClose() CloseServer(); GetDlgItem(IDC_BN_START)-EnableWindow(TRUE); GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE); void CServerDlg:OnAccept() / 创建新客户CMySocket *pNewClient = new CMySocket; pNewClient-Initialize(this); m_Server.Accept(*pNewClient); / 放入链表中m_lsC

16、lient.AddTail(pNewClient); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 20 页 - - - - - - - - - 7 void CServerDlg:OnClientClose(WPARAM wParam, LPARAM lParam) CMySocket *p_delClient = (CMySocket*)wParam; / 关闭该用户p_delClient-ShutDown(); char bufferBUFFERSIZE; whi

17、le(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 = (CMySocket *)m_lsClient.GetNext(psList); if(p_delClient=p_curClient) m_lsClient.RemoveAt(ps

18、Cur); break; / 发送信息告诉其他用户该客户退出CString strMsg; strMsg.LoadString(IDS_CLIENT_CLOSE); NETMESSAGE netMessage(PTC_CLIENT_QUIT, p_delClient-GetName(), _T(), p_delClient-GetName() + strMsg); SendToAllClient(netMessage); / 界面上清理该用户信息m_lbUser.DeleteString(m_lbUser.FindString(-1, p_delClient-GetName(); ShowIn

19、Display(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, sizeof(netMessage); switch(netMessage.type) case PTC_NEW: / 新客户加入New

20、ClientAdd(p_curClient, &netMessage); break; case PTC_SAY: / 普通聊天ShowMessage(netMessage); break; / 把加工过的信息发送给其他用户SendToAllClient(netMessage); void CServerDlg:CloseServer() if(!m_bServer) return; / 向所有客户发送服务端关闭的信息CString strInfo; strInfo.LoadString(IDS_CLOSESERVER); NETMESSAGE netMessage(PTC_SYSTEM, _

21、T(), _T(), strInfo); SendToAllClient(netMessage); / 服务端界面显示关闭信息ShowInDisplay(strInfo); / 关闭服务端m_Server.Close(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 20 页 - - - - - - - - - 8 / 关闭客户端char bufferBUFFERSIZE; CMySocket *m_pClient; POSITION psList = m_lsCli

22、ent.GetHeadPosition(); while(psList!=NULL) m_pClient = (CMySocket *)m_lsClient.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 NETMESS

23、AGE &netMessage) CMySocket *m_pClient; POSITION psList = m_lsClient.GetHeadPosition(); 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:OnDes

24、troy() CDialog:OnDestroy(); / TODO: Add your message handler code here / 新用户加入void CServerDlg:NewClientAdd(CMySocket *p_client, NETMESSAGE *netMessage) / 存入用户名字p_client-SetName(netMessage-form); / 在列表框中显示该用户m_lbUser.AddString(p_client-GetName(); / 发送用户列表给该客户NETMESSAGE netMsg(PTC_USER_LIST, _T(), _T(

25、), _T(); int iListLen = m_lbUser.GetCount(); CString strMsg; for(int index=m_lbUser.GetTopIndex(); indexSendMsg(netMsg); / 加工信息strMsg.LoadString(IDS_NEW_CLIENT); strMsg = p_client-GetName() + strMsg; strcpy(netMessage-data, (LPCTSTR)strMsg); / 显示该用户进入ShowInDisplay(strMsg); / 显示普通消息void CServerDlg:Sh

26、owMessage(NETMESSAGE netMessage) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 20 页 - - - - - - - - - 9 CString strTo = netMessage.to; if(strTo=_T() strTo = 所有人 ; CString strForm = netMessage.form; CString strMsg = netMessage.data; CString strOut = strForm + 对

27、 + 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_FILE static char THIS_FILE = _FILE_; #endif / / CAboutDlg dialog used for App About class CAboutDlg :

28、 public CDialog public: CAboutDlg(); enum IDD = IDD_ABOUTBOX ; protected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support protected: DECLARE_MESSAGE_MAP() ; CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD) void CAboutDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX)

29、; 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_MAINFRAME); void CClientDlg:DoDataExchang

30、e(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, CDialog) ON_WM_SYSCOMMAND() ON_WM_P

31、AINT() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 20 页 - - - - - - - - - 10 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_MES

32、SAGE(WM_SOCKETCLOSE, OnServerClose) ON_MESSAGE(WM_SEND, OnSend) ON_MESSAGE(WM_CONNCET, OnConnect) ON_LBN_DBLCLK(IDC_LIST_USER, OnDblclkListUser) END_MESSAGE_MAP() / / CClientDlg message handlers BOOL CClientDlg:OnInitDialog() CDialog:OnInitDialog(); ASSERT(IDM_ABOUTBOX & 0 xFFF0) = IDM_ABOUTBOX); AS

33、SERT(IDM_ABOUTBOX AppendMenu(MF_SEPARA TOR); pSysMenu-AppendMenu(MF_STRING , IDM_ABOUTBOX, strAboutMenu); SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small icon / 参数初始化m_Socket.Initialize(this); m_strNetIP = _T(127.0.0.1); m_iNetPort = 3127; m_bConnect = FALSE; GetDlgItem(I

34、DC_BN_CLOSE)-EnableWindow(FALSE); GetDlgItem(IDC_BN_SEND)-EnableWindow(FALSE); return TRUE; / return TRUE unless you set the focus to a control void CClientDlg:OnSysCommand(UINT nID, LPARAM lParam) if (nID & 0 xFFF0) = IDM_ABOUTBOX) CAboutDlg dlgAbout; dlgAbout.DoModal(); else CDialog:OnSysCommand(n

35、ID, lParam); void CClientDlg:OnPaint() if (IsIconic() CPaintDC dc(this); / device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Widt

36、h() - cxIcon + 1) / 2; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 20 页 - - - - - - - - - 11 int y = (rect.Height() - cyIcon + 1) / 2; dc.DrawIcon(x, y, m_hIcon); else CDialog:OnPaint(); HCURSOR CClientDlg:OnQueryDragIcon() return (HCURSOR) m_hIcon; void CC

37、lientDlg: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); ShowInDisplay(strConnectError); return; CString s

38、trInfo; 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_SUCCEED_CONNECT); ShowInDisplay(strInf

39、o); 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:OnBnClose() if(m_bConnect) m_So

40、cket.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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - -

41、 - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 20 页 - - - - - - - - - 12 void CClientDlg:OnBnSend() OnSend(); m_strSend = _T(); UpdateData(FALSE); void CClientDlg:OnReceive() NETMESSAGE netMessage; m_Socket.Receive(char *)&netMessage, sizeof(netMessage); CString strForm = netMessage.form; / 过滤

42、自已发出的信息if(strForm=m_strName) return; CString strTo = netMessage.to; CString strMsg = netMessage.data; switch(netMessage.type) case PTC_USER_LIST: / 用户列表m_lbUser.AddString(strMsg); break; case PTC_NEW: / 新用户进入m_lbUser.AddString(strForm); ShowInDisplay(strMsg); break; case PTC_SAY: ShowMessage(netMess

43、age); case PTC_WHISPERING: / 密语if(strTo!=m_strName) return; ShowMessage(netMessage); break; case PTC_CLIENT_QUIT: / 有用户退出m_lbUser.DeleteString(m_lbUser.FindString(-1, strForm); ShowInDisplay(strMsg); break; void CClientDlg:OnServerClose() if(!m_bConnect) return; CString strMsg; strMsg.LoadString(IDS

44、_SERVER_CLOSE); ShowInDisplay(strMsg); 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(); void CClientDlg:OnSend() UpdateData(TRUE); / 主要是填充NETMESSAGE

45、 结构体NETMESSAGE netMessage; strcpy(netMessage.form, m_strName); strcpy(netMessage.data, m_strSend); / 取得列表框中的用户if(m_lbUser.GetText(m_lbUser.GetCurSel(), netMessage.to)=LB_ERR) strcpy(netMessage.to, _T(); if(m_bWhispering) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第

46、 12 页,共 20 页 - - - - - - - - - 13 / 密语CString strTo = netMessage.to; if(strTo=_T() MessageBox(请选择对方 !, 错误 ); return; netMessage.type = PTC_WHISPERING; else strcpy(netMessage.to, _T(所有人 ); netMessage.type = PTC_SAY; / 发送该信息m_Socket.SendMsg(netMessage); / 显示发送信息CString strTo = netMessage.to; CString s

47、trMsg = netMessage.data; ShowInDisplay( 你对 + strTo + 说: + strMsg); void CClientDlg:ShowInDisplay(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_strName) str

48、To = 你; 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 here m_lbUser.SetCurSel(-1); void CClientDlg:OnConnect() m_bCo

49、nnect = TRUE; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 20 页 - - - - - - - - - 14 2、调试分析过程描述Login 服务器:启动服务器:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 20 页 - - - - - - - - - 15 Login 客户端:创建张三、李四、王五客户端,并与服务器连接:名师

50、资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 20 页 - - - - - - - - - 16 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 20 页 - - - - - - - - - 17 服务器显示:开始聊天,群聊:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁