




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录摘要3一 设计内容.31、设计目的32、设计要求3二 设计原理3三 设计过程.41、程序设计流程及源代码.4(1)流程图.4(2)源代码.4I服务器4II客户端.92、调试分析过程描述143、结果分析19结论.20参考文献.20摘要当今世界正处于信息时代,计算机和通信网络是这一时代所谓“信息基础设施”。在互联网相当普及的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。聊天室程序可以说是网上最简单的多点通信程序。一个简单的聊天室, 从程序员的观点来看就是在多个I/O端点之间实现多对多的通信。基于SOCKET的局域网通信是一种灵活的、易于实现的、低成本的方法。它可以运行在各种使用TCP/IP协议作为通讯协议的网络上。而在SOCKET API的帮助下,开发基于SOCKET的局域网通信软件也是易于实现的。来源: sdeer圣迪奥正文一、设计内容1、设计目的综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以Visual C+作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。2、设计要求 采用客户/服务器模式,分为客户端程序和服务器端程序。服务器采用WINSOCK I/O模型中的任一种,支持多个客户同时在线聊天。客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转,或考虑UDP打洞直接建立端端连接)。二、设计原理服务器端通过socket()系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。然后登录成功的客户就可以在服务器上聊天了。客户端程序相对简单,只需要建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。socket聊天室基本原理是,抛开CGI(公共网关接口)和www服务器,根据html规范,接收到浏览器的请求以后,模仿www服务器的响应,将聊天内容发回浏览器。在浏览器看来就像浏览一个巨大的页面一样始终处于页面联接状态, 这就是一个专门的聊天服务器,一个简化了的www服务器。三、设计过程1、程序设计流程及源代码(1)流程图 (2)源代码 I服务器:/ ServerDlg.cpp : implementation file/#include stdafx.h#include Server.h#include ServerDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();protected: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 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_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, OnClientClose)ON_MESSAGE(WM_ACCEPT, OnAccept)ON_WM_DESTROY()END_MESSAGE_MAP()/ CServerDlg message handlersBOOL CServerDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);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 lParam)if (nID & 0xFFF0) = 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) 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);elseCDialog:OnPaint();HCURSOR CServerDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CServerDlg:OnBnStart() / 创建套接字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_START)-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 *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 = (CMySocket *)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_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, sizeof(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(IDS_CLOSESERVER);NETMESSAGE netMessage(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_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 NETMESSAGE &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:OnDestroy() 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(), _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:ShowMessage(NETMESSAGE netMessage)CString strTo = netMessage.to;if(strTo=_T()strTo = 所有人;CString strForm = netMessage.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/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();enum IDD = IDD_ABOUTBOX ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV supportprotected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()/ CClientDlg dialogCClientDlg: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: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, CDialog)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, OnConnect)ON_LBN_DBLCLK(IDC_LIST_USER, OnDblclkListUser)END_MESSAGE_MAP()/ CClientDlg message handlersBOOL CClientDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ 参数初始化m_Socket.Initialize(this);m_strNetIP = _T();m_iNetPort = 3127;m_bConnect = FALSE;GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE);GetDlgItem(IDC_BN_SEND)-EnableWindow(FALSE);return TRUE; / return TRUE unless you set the focus to a controlvoid CClientDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CClientDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) 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);elseCDialog:OnPaint();HCURSOR CClientDlg:OnQueryDragIcon()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);ShowInDisplay(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_SUCCEED_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:OnBnClose() 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:OnBnSend() 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(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(netMessage);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_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结构体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)/ 密语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 = netMessage.to;CString strMsg = 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)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;2、调试分析过程描述Login服务器:启动服务器:Login客户端:创建张三、李四、王五客户端,并与服务器连接:服务器显示:开始聊天,群聊:张三与李四私聊:王五看不到私聊内容聊天室是分客户端和服务端两个应用程序的,两个应用程序要想实现交互必须编写相应的指令和识别指令的代码,我写的这是个指令依次是 向服务端请求在线人数列表用户私聊 用户退出 的命令,但用户想要进行以上动作中的任何一个时,在用户按下按键的时候,客户端都是向服务端发送相应的指令,再由服务端实际的执行。只要弄懂客户端和服务端的交互过程后,这一切都会看上去很简单的。需要改进的地方:消息记录中未能提供时间的实时显示;客户端没有自己的ID标志;服务器不能与客户端聊天。3、结果分析:设计基本符合要求,支持多个客户同时在线聊天,并支持客户端之间的私聊;服务器窗口的列表框中能显示当前在线用户,并能监视客户端的群聊内容。然而这个聊天室还有许多不足之处需要改进,界面也比较粗糙,需要进一步美化。结论通过这次课程设计,使我对网络编程和VC+有了更进一步的认识和了解,也让我学会了MFC和界面制作的一些知识。要想学好网络编程要重在实践,必须通过不断的实践操作才能更好地掌握它。我也发现我的好多不足之处,首先是自己在基础上还不行,经常出错,通过学习已有所改进;再有对VC的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对VC中经常出现的错误也不了解,通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习VC,还是其它的语言和学科,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己更好地学好计算机。通过上网查询收集资料和同学的交流,让我觉得要完成一个任务,一个人悄无声息是很难做好的,和同学交流研究会使我们获得更多,也能使自己少走许多弯路,事半功倍。这给我启示,学习一定要勇于实践,虚心请教。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!参考文献1 任泰明著. TCP/IP协议与网络编程. 西安电子科技大学出版社. 20042 唐克著. MFC程序设计:Using Visual C+ 6.0. 北京希望电子出版社. 20023 邓全良著. Winsock网络程序设计. 中国铁道出版社. 2002袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离婚协议签订后子女抚养权及共同债务承担协议
- 离婚双方关于房产处置及租金收入分配补充协议
- 双方自愿离婚及财产分配与子女抚养权协议书
- 离婚协议执行受阻起诉范本与维权策略
- 燃煤发电项目能源审计与优化方案
- 非公有制企业劳动合同主体变更与员工权益保护协议
- xx市供热管网改造工程技术方案
- 房产分割离婚协议范本:土地使用权分配合同
- 智能化技术与高职园林项目管理的思政融合路径
- 老河口玻璃鳞片施工方案
- GB 28235-2020紫外线消毒器卫生要求
- 小学班队工作原理与实践班队活动的组织与设计课件
- 固体废物采样记录
- 洁净手术室相关知识考核试题及答案
- Avaya新产品和解决方案介绍课件
- 布洛芬缓释胶囊生产工艺流程课件
- 台湾问题与祖国统一
- 2023年阜阳市颍州区工会系统招聘考试笔试题库及答案解析
- 软式内镜考核标准
- 第3课 秦统一多民族封建国家的建立 课件(共19张PPT)2022-2023学年统编版(2019)高中历史必修中外历史纲要上册
- (新教材)广东粤教粤科版五年级上册科学 第6课 植物需要阳光 教案
评论
0/150
提交评论