版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、指导老师评阅成绩表指导老师评阅成绩表学习与工作态度(30%)选题的价值与意义(10%)文献综述(10%)研究水平与设计能力(20%)课程设计说明说(论文)撰写质量(20%)学术水平与创新(10%)总分指导老师签名: 年 月 日课程设计答辩记录及评价表课程设计答辩记录及评价表学生讲述情况教师主要提问记录IP 地址是怎么判断合不合法的?怎么把 FORM 的名字改了?字体大小和颜色的改变是怎么实现的?Encoding.UTF8.GetBytes 编码是怎么实现的,为什么要用这个?正则表达式的 和有什么区别?学生回答问题情况1.调用函数 public static bool CheckIPAddres
2、s(string IP)来完成的 IP 验证。2. 在 Form 的属性里面修改 Text 就可以了。3. 添加 menuStrip1 控件,添加字体项目,调用设置方法就可以完成了。4. 用这个编码可以把汉字编码。5. 0-93,4的意思是匹配 09 之间的数至少三次之多四次,也就是说整则表达式的 表示匹配一个,表示匹配多少次。评价参考标准评分项目分值优良中及格差评分总分选题的价值与意义1098764文献综述1098764研究水平与设计能力201917151310课程设计说明书(论文)撰写质量201917151310学术水平与创新1098764答辩评分答辩效果302825221915是否同意论
3、文(设计)通过答辩同意 不同意答辩小组成员签名答辩小组组长签名: 年 月 日课程设计成绩评定表课程设计成绩评定表评分项目评分比例分数课程设计总分成绩汇总指导老师评分50%答辩小组评分50%成成 都都 信信 息息 工工 程程 学学 院院课课 程程 设设 计计题目:异步题目:异步 TCP 简单通信程序简单通信程序作者姓名:作者姓名:纪纪 红红班班 级:级:信息安全信息安全 0808 级四班级四班学学 号:号:20081221272008122127指指导导教教师师:林宏刚林宏刚日日 期:期:20112011 年年 6 6 月月 2121 日日 作者签名:摘摘 要要随着计算机网络技术的飞速发展,比如
4、基于互联网的信息发布,通信,数据共享等等。网络技术越来越受到人们的重视,它已逐渐渗入我们生活的各个层面,网络聊天工具在丰富的网络生活中也扮演了重要的角色。随着计算机网络技术的发展,很多政府机构,企业,学校,都是先以一个统一的局域网联结在一起,再分别接入 INTERNET.因此基于局域网的即时通信工具,就这样应运而生了。所以本系统主要完成了在局域网内的简单异步聊天功能,并在WINDOWS 平台上加以了实现.程序分为客户端和服务器端两个程序。用多线程实现不同的并行任务。并进行了人性化的界面设计,使用起来更加简单方便,并且功能十分合理,又易于扩展以及个性化定制。本文通过局域网聊天系统来具体共享内存实
5、现进程间的数据交换,利用 windows 消息机制实现进程间的同步,两种机制结合使用。关键词关键词:异步聊天;局域网;即时通信;客户端;服务端;多线程;进程同步; 1 引言引言.11.1 课题背景.11.2 国内外现状.11.3 本课题研究的迫切性.21.4 本课题的研究作用.21.5 本文的主要工作.22.TCP 异步聊天系统需求分析及开发工具异步聊天系统需求分析及开发工具.22.1 系统目标 .22.2 系统应具备的基本功能 .32.3.1 运行环境.32.3.2 C#网络编程技术介绍.32.3.3Visual Studio 开发环境介绍.43.系统总体结构设计系统总体结构设计.53.1
6、基本简介 .53.2 系统功能模块设计 .53.2.1 客户端.53.2.2 服务器端.64.系统流程实现系统流程实现.74.1 系统设计流程 .74.2 详细设计 .75.系统测试与分析系统测试与分析.165.1 测试 .16结论结论.16参考文献参考文献.17第 1 页 共 22 页1 1 引言引言1.1 课题背景课题背景近年来,随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的扩大,业务量的增加,在局域网上运行
7、的应用越来越多,如知识库、网络会议、数据库应用和数据的同步与备份等,这些应用对局域网的信息吞吐、处理能力的要求也越来越高。这些在企业内部原有局域网设计之初未曾考虑到的新情况的出现使得局域网不堪重负,容易发生信息阻塞,此时,局域网不但不能提高生产效率,反而成为企业发展的瓶颈。 为了解决上述矛盾,人们提出了许多方法。提升网络带宽及增加服务器的吞吐能力是解决此矛盾的一种方法。然而,从企业运行的成本方面考虑,无论是单纯地提升网络带宽或增加服务器的吞吐能力都不能从根本上解决局域网资源紧张的问题,对旧有局域网的大规模硬件改造反而会增加企业的负担。 本系统是一种基于 Socket 的局域网通信工具的设计与实
8、现方法。基于Socket 的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。 基于 Socket 的局域网聊天工具是此类局域网通信软件的具体实例之一,它很好地诠释了 Socket 通信的原理,并且在企业内部通信、教学、讨论等应用中都具有一定的实用价值。它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点。基于 Socket 的局域网通信软件应用范围广阔,不但可
9、以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。1.2 国内外现状国内外现状基于局域网的即时通信工具,实际上是互联网即时通信工具的一个小规模版本,广域网上的即时通信工具,如今一般采用 UDP 或者 TCP 协议体系来实现 ,开发技术已经比较成熟,比如较早的 ICQ,MSN Messanger,Yahoo 通这第 2 页 共 22 页些国外开发的产品,还有国产的有名的 QQ,新浪 UC,LAVA-LAVA 等,这些工具统统都实现了广域网上的即时通信,尽管都是即时通信,实现了即时聊天,以及文件传输的主要功能,但是也各有各的特色,比如 ICQ
10、的巨大客户群,MSN 的个性化表情,YAHOO 通的易操作性等。而 QQ 也具有一个相当方便的屏幕截图功能,另外就是,所有上述软件都实现了网络即时的视频,语音聊天功能。这些软件,在使用方面各有特色,在实现方面也各有所长,但基于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是各种利用各种平台上的网络通信接口,建构基于下层TCP/IP,或者 UDP/IP 协议的软件产品。在局域网内,这些功能的实现跟广域网相比更加简单,因为局域网的网络结构本身比广域网要复杂,但是又可以借些理解网络协议,以及网络通信工具的实现原理,所以仍然极具研究价值。1.3 本课题研究
11、的本课题研究的迫切性迫切性随着计算机网络技术的发展,很多政府机构,企业,学校,都是先以一个统一的局域网联结在一起,再分别接入 INTERNET.因此基于局域网的即时通信工具,就这样应运而生了。所以本系统主要完成了在局域网内的简单异步聊天功能,并在 WINDOWS 平台上加以了实现.程序分为客户端和服务器端两个程序。1.4 本课题的研究本课题的研究作用作用所以本系统主要完成了在局域网内的简单异步聊天功能,并在 WINDOWS 平台上加以了实现.程序分为客户端和服务器端两个程序。用多线程实现不同的并行任务。并进行了人性化的界面设计,使用起来更加简单方便,并且功能十分合理,又易于扩展以及个性化定制。
12、本文通过局域网聊天系统来具体共享内存实现进程间的数据交换,利用 windows 消息机制实现进程间的同步,两种机制结合使用。1.5 本文的主要工作本文的主要工作本文主要工作是设计一个基于 WINDOWS 平台的局域网即时聊天工具,然后阐述本软件的功能、特点及使用方法,并详细阐述开发本软件所用的相关技术,具体分析本软件的各个模块的功能及实现方法,说明本软件的设计思想及方法。第 3 页 共 22 页2.TCP2.TCP 异步聊天系统需求分析及开发工具异步聊天系统需求分析及开发工具2.1 系统目标系统目标(1)用户端之间的信息发送,本程序需要实现的最基本的功能(2)在线用户主机名列表的维护。(3)在
13、 C/S 模式中,服务器与客户端是相互依赖的。(4)操作简单,界面简洁美观,有背景,有字体设置,有表情选择等。2.2 系统应具备的基本功能系统应具备的基本功能启动服务器端启动客户端等待客户的连接请求向服务器端发送连接请求接收客户端的连接请求发送 welcome!聊天2.32.3 开发环境及工具开发环境及工具2.3.1 运行环境运行环境Windows 系统在装有 Visual studio2005 及以上版本的系统2.3.2 C#网络编程技术介绍网络编程技术介绍.NET 提供了两个用于网络编程的名空间: System.Net 和 System.Net.Sockets.这些类和方法可以帮助我们进行
14、网络编程,通过网络进行通信.通信可以是面向连第 4 页 共 22 页接的,也可以是面向无连接的;既可以采用数据流模式,也可以采用数据报的模式.广泛使用的 TCP 协议用基于数据流的通信,而 UDP 协议用于基于数据报的通信.System.Net.Sokcets.Socket 是 System.Net.Sockets 名空间下面一个非常重要的类. 每一个套接字的实例都有一个本地的和一个远程的端点附加在上面.本地的端点包括了当前套接字实例的连接信息.NET 还提供了其它的一些类用于我们进行网络编程,像 IPEndPoint, IPAddress, SocketException 等等. .NET
15、支持同步和异步两种在客户机和服务器之间的通信方式.NET 提供了不同的方法用于支持这两种类型的通信.同步的方法工作在阻塞模式,方法在工作完成之前是不返回的.但是异步的方法工作在非阻塞模式,但是立即返回的,可能在操作完成之前.Dns 类位于 S 名空间下,它用于创建和发送一个请求用于从 DNS 服务器获取一个主机服务器的信息.当然,在访问 DNS 之前,机器必须首先要连接到网络上,当在一台独立的机器上执行 DNS 查询时,由于无法连接到 DNS 服务器,就会产生一个 Systm.Net.SocketException 异常.这个类的所有成员方法都是静态的.这个类中最重要的方法是:public s
16、tatic IPHostEntry GetHostByAddress(string address)地址应该是一个用点开的正确的 IP 地址,这个方法返回一个 IPHostEntry 实例,它包括了主机的信息.如果 DNS 服务器不可用,这个方法将产生一个SocketException 异常.public static string GetHostName()这个方法返回本地机器的DNS 服务器名称.public static IPHostEntry Resolve(string hostname)这个方法解析一个 DNS 主机名称或 IP 地址为一个 IPHostEntry 实例. 主机名称
17、应该是一个用点分开的 IP 地址,如:IPHostEntry 类,IPHostEntry 类是一个容器类,它包含 INTERNET 上主机的地址信息.这个类不是线程安全的.下面是这个类的几个重要成员.AddressList 属性,该属性给出一个 IPAddress 的数组,可以获取或设置与主机关联的 IP 地址列表.Aliases 属性,该属性用于获取或设置与主机关联的别名列ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset
18、以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false2.3.3Visual Studio 开发环境
19、介绍开发环境介绍Visual Studio 2005 和 .NET Framework 2.0 将在应用程序开发的所有方面取得大幅进展。首先,Visual Studio 2005 根据开发人员个人的需要调整软件开发体验,设置新的开发人员工作效率标准。这一“个性化工作效率”将在开发环境和 .NET Framework 类库中提供相应的功能,以帮助开发人员在最少的时间内克服其最为紧迫的困难。其次,Visual Studio 2005 使开发人员能够通过与 第 5 页 共 22 页Microsoft Office System 和 SQL Server 2005 的更好集成,在更广泛的应用程序开发方
20、案中应用现有的技能。最后,Visual Studio 2005 将提供一组新的工具和功能,以满足目前大规模企业的应用程序开发需要。3.3.系统总体结构设计系统总体结构设计3.1 基本简介基本简介1.首先启动服务器端和客户端2.服务器端开始监听3 客户端开始连接4.服务器端接收客户端的连接请求5.建立连接6.开始聊天7.加入了表情,字体,颜色等的设计第 6 页 共 22 页3.2 系统功能模块设计系统功能模块设计3.2.1 客户端客户端第 7 页 共 22 页3.2.2 服务器端服务器端第 8 页 共 22 页4.4.系统流程实现系统流程实现4.1 系统设计流程系统设计流程服务器端用 socke
21、t 方法建立套接字用 bind 方法把套接字与本地地址绑定用 Listen 方法准备好连接用 accept 方法接受连接,并等待 client 端连接如连接已建立,accept 返回新的套接字用 Receive 和 send 方法在套接字上做数据交换进行连接数据交换Shutdown 方法用于释放连接关闭套接字,服务结束用 socket 方法建立套接字用 connect 方法把套接字与 server 端相连用 Receive 和 send 方法在套接字上做数据交换Shutdown 方法用于释放连接关闭套接字,服务结束客户端4.2 详细设计详细设计一、服务器端开始监听 /开始服务器第 9 页 共
22、22 页 private void button2_Click(object sender, EventArgs e) /侦听客户连接请求 Thread myThread = new Thread(new ThreadStart(AcceptConnection); myThread.Start(); button2.Enabled = false; button3.Enabled = true; private void AcceptConnection() /IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName(); IPAddress i
23、p = IPAddress.Any; listener = new TcpListener(ip, 58888); listener.Start(); while (isExit = false) try allDone.Reset(); /应用在异步操作完成时调用的回调方法 AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallBack); listBoxStatus.Invoke(setlistboxcallback, 开始等待连接.); /开始接受客户端的连接 listener.BeginAcceptTcpClient
24、(callback, listener); allDone.WaitOne(); /使当前进程挂起,知道接收到客户的连接 catch (Exception e) listBoxStatus.Invoke(setlistboxcallback, e.Message); break; /异步操作完成时调用的回调方法 private void AcceptTcpClientCallBack(IAsyncResult iar) try allDone.Set();/设置无信号状态的事件 TcpListener mylistener = (TcpListener)iar.AsyncState; /异步接
25、收传入的连接,并建立新的 TcpClient 对象处理信息 TcpClient client = mylistener.EndAcceptTcpClient(iar); listBoxStatus.Invoke(setlistboxcallback, 已接受客户连接: + client.Client.RemoteEndPoint);第 10 页 共 22 页 comboBox1.Invoke(setcomboboxcallback, client.Client.RemoteEndPoint.ToString(); DataReadWrite datareadwrite = new DataRe
26、adWrite(client); clientlist.Add(datareadwrite); SendString(datareadwrite, welcome!); datareadwrite.ns.BeginRead(datareadwrite.read, 0, datareadwrite.read.Length, ReadCallBack, datareadwrite); catch (Exception e) listBoxStatus.Invoke(setlistboxcallback, e.Message); return; /从客户端读取信息处理的异步回调方法 private
27、void ReadCallBack(IAsyncResult iar) try DataReadWrite datareadwrite = (DataReadWrite)iar.AsyncState; int recv = datareadwrite.ns.EndRead(iar); richTextBox1.Invoke(setrichtextboxcallback, string.Format(01, datareadwrite.client.Client.RemoteEndPoint, System.Text.Encoding.UTF8.GetString(datareadwrite.r
28、ead, 0, recv); if (isExit = false) datareadwrite.InitReadArray(); datareadwrite.ns.BeginRead(datareadwrite.read, 0, datareadwrite.read.Length, ReadCallBack, datareadwrite); catch (Exception e) listBoxStatus.Invoke(setlistboxcallback, e.Message); /向客户端发送数据的方法 private void SendString(DataReadWrite dat
29、areadwrite, string str) try datareadwrite.write = System.Text.Encoding.UTF8.GetBytes(str + rn); datareadwrite.ns.BeginWrite(datareadwrite.write, 0, datareadwrite.write.Length, new AsyncCallback(SendCallBack), datareadwrite);第 11 页 共 22 页 datareadwrite.ns.Flush(); listBoxStatus.Invoke(setlistboxcallb
30、ack, string.Format(向0发送:1, datareadwrite.client.Client.RemoteEndPoint, str); catch (Exception e) listBoxStatus.Items.Add(e.Message); /发送回调函数 private void SendCallBack(IAsyncResult iar) DataReadWrite datareadwrite = (DataReadWrite)iar.AsyncState; try datareadwrite.ns.EndWrite(iar); catch (Exception e
31、) listBoxStatus.Invoke(setlistboxcallback, e.Message); comboBox1.Invoke(removecomboboxcallback, datareadwrite); /移出客户 private void RemoveComboBoxItems(DataReadWrite datareadwrite) int index = clientlist.IndexOf(datareadwrite); comboBox1.Items.RemoveAt(index); /状态显示 private void SetListBox(string str
32、) listBoxStatus.Items.Add(str); listBoxStatus.SelectedIndex = listBoxStatus.Items.Count - 1; listBoxStatus.ClearSelected(); /接收客户端信息 private void SetReceiveText(string str) richTextBox1.AppendText(str); /添加客户 private void SetComboBox(object obj)第 12 页 共 22 页 comboBox1.Items.Add(obj); /发送数据 private v
33、oid button1_Click(object sender, EventArgs e) int index = comboBox1.SelectedIndex; if (index = -1) MessageBox.Show(请先选择接收方,再单击发送); else string s1 = 服务器端 + comboBox2.SelectedItem + 对你说:; string s2 = richTextBox2.Text; string sendstring = s1 + s2; DataReadWrite obj = (DataReadWrite)clientlistindex; Se
34、ndString(obj, sendstring);/调用 SendString 方法发送数据 richTextBox2.Clear(); string selfstring = 你对0 + comboBox2.SelectedItem + 说: + s2+rn; richTextBox1.AppendText(selfstring); /服务器停止 private void button3_Click(object sender, EventArgs e) isExit = true; allDone.Set(); button2.Enabled = true; button3.Enable
35、d = false; private void 字体 ToolStripMenuItem_Click(object sender, EventArgs e) FontDialog fontDialog = new FontDialog(); fontDialog.Color = richTextBox1.ForeColor; fontDialog.AllowScriptChange = true; fontDialog.ShowColor = true; if (fontDialog.ShowDialog() != DialogResult.Cancel) richTextBox1.Selec
36、tionFont = fontDialog.Font; richTextBox1.SelectionColor = fontDialog.Color; richTextBox2.SelectionFont = fontDialog.Font; richTextBox2.SelectionColor = fontDialog.Color;第 13 页 共 22 页 private void Form1_Load(object sender, EventArgs e) comboBox2.Items.Add(笑着地); comboBox2.Items.Add(高兴地); comboBox2.Ite
37、ms.Add(含情脉脉地); comboBox2.Items.Add(微笑地); comboBox2.Items.Add(幸福地); comboBox2.Items.Add(有点脸红地); comboBox2.Items.Add(使劲安慰地); comboBox2.Items.Add(自言自语地); comboBox2.Items.Add(差点要哭地); comboBox2.Items.Add(嚎啕大哭地); comboBox2.Items.Add(一把鼻涕地); comboBox2.Items.Add(不怀好意地); comboBox2.Items.Add(神秘兮兮地); comboBox2
38、.Items.Add(不知所措地); comboBox2.Items.Add(笑着地); 二、服务器端 /验证输入的 IP 地址是否符合标准 public static bool CheckIPAddress(string IP) string pattern = (d1,2)|(1d2)|(20-4d)|(250-5).)3(d1,2)|(1d2)|(20-4d)|(250-5); System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(pattern); if (regex.
39、Match(IP).Success) return true; else return false; private void buttonConnect_Click(object sender, EventArgs e) if (CheckIPAddress(textBoxIP.Text) = true) 第 14 页 共 22 页 client = new TcpClient(AddressFamily.InterNetwork); /IPAddress IP = Dns.GetHostAddresses(Dns.GetHostName(); IPAddress ip = IPAddres
40、s.Parse(textBoxIP.Text); AsyncCallback connectCallBack = new AsyncCallback(ConnectCallBack); allDone.Reset(); client.BeginConnect(ip, 58888, connectCallBack, client); listBoxStatus.Invoke(setlistboxcallback, string.Format(本机终结点0, client.Client.LocalEndPoint); listBoxStatus.Invoke(setlistboxcallback,
41、 开始与服务器连接); allDone.WaitOne(); else MessageBox.Show(Ip 地址输入错误); private void ConnectCallBack(IAsyncResult iar) allDone.Set(); try client = (TcpClient)iar.AsyncState; client.EndConnect(iar); listBoxStatus.Invoke(setlistboxcallback, string.Format(与服务器0连接成功, client.Client.RemoteEndPoint); ns = client.G
42、etStream(); DataRead dataRead = new DataRead(ns, client.ReceiveBufferSize); ns.BeginRead(dataRead.msg, 0, dataRead.msg.Length, ReadCallBack, dataRead); catch (Exception e) listBoxStatus.Invoke(setlistboxcallback, e.Message); return; private void ReadCallBack(IAsyncResult iar) try DataRead dataRead =
43、 (DataRead)iar.AsyncState; int recv = dataRead.ns.EndRead(iar); richTextBox1.Invoke(setRichTextBoxReceiveCallBack, 第 15 页 共 22 页System.Text.Encoding.UTF8.GetString(dataRead.msg, 0, recv); if (isLive = false) dataRead = new DataRead(ns, client.ReceiveBufferSize); ns.BeginRead(dataRead.msg, 0, dataRea
44、d.msg.Length, ReadCallBack, dataRead); catch (Exception e) listBoxStatus.Invoke(setlistboxcallback, e.Message); private void SendData(string str) try byte bytesdata = System.Text.Encoding.UTF8.GetBytes(str + rn); ns.BeginWrite(bytesdata, 0, bytesdata.Length, new AsyncCallback(SendCallBack), ns); ns.
45、Flush(); catch (Exception e) listBoxStatus.Items.Add(e.Message); private void SendCallBack(IAsyncResult iar) try ns.EndWrite(iar); catch (Exception e) listBoxStatus.Invoke(setlistboxcallback, e.Message); private void SetListBox(string str) listBoxStatus.Items.Add(str); listBoxStatus.SelectedIndex =
46、listBoxStatus.Items.Count - 1; listBoxStatus.ClearSelected();第 16 页 共 22 页 private void SetRichTextBoxReceive(string str) richTextBox1.AppendText(str); private void Form1_FormClosing(object sender, FormClosingEventArgs e) isLive = true; allDone.Set(); private void button1_Click(object sender, EventA
47、rgs e) string s1 = comboBox3.SelectedItem + 对你说:; string s2 = richTextBox2.Text; string sendstring = s1 + s2; SendData(sendstring); richTextBox2.Clear(); string selfstring = 你对服务器 + comboBox3.SelectedItem + 说: + s2 +rn; richTextBox1.AppendText(selfstring); private void 字体 ToolStripMenuItem_Click(object sender, EventArgs e) FontDialog fontDialog = new FontDialog(); fontDialog.Color = richTextBox1.ForeColor; fontDialog.AllowScriptChange = true; fontDialog.ShowColor = true; if (f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外贸建设与规划
- 手术室预防压疮管理
- 浙江省丽水市五校高中发展共同体2024-2025学年高二上学期11月期中考试语文试题 含解析
- 流感的防治课件
- 《“形”动起来》教案
- 重庆市长寿中学2024-2025学年高二上学期12月月考生物试题(含答案)
- 山西省部分学校2024-2025学年高一上学期11月期中联考语文试卷(含答案)
- 22 3 实际问题与二次函数 同步精练人教版数学九年级上册
- 湖北省黄石市黄石港区四校2024-2025学年九年级上学期期中联考化学试题无答案
- 河北省邢台市威县第二中学、第三中学2024-2025学年七年级上学期12月月考地理试题(含答案)
- 设备维护人员的技能要求
- 药学生职业规划
- 慢性肾脏病矿物质及骨代谢异常CKDMBD的规范治疗
- 吉林省普通高等学校实验教学示范中心申请
- 智慧快递驿站建设方案
- GJB438B《软件测试报告》模板范例-gjb438资源
- 非遗体验馆项目商业计划书
- 篮球投篮教学
- 诊断课程期末考试复习题库
- 城市智慧管廊设计方案
- 骨科住院患者的应急预案
评论
0/150
提交评论