版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c#socket、TCPCIient^TCPListener用法详解
VisualC#.Net网络程序开发-Socket篇
Microsoft.NetFramework为应用程序访问Internet提供了分层
的、可扩展的以及受管辖的网络服务,其名字空间System.Net和
System.Net.Sockets包含丰富的类可以开发多种网络应用程
序。.Net类采用的分层构造允许应用程序在不同的控制级别上访问
网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级
别几乎囊括了Internet的所有需要--从socket套接字到普通的请
求/响应,更重要的是,这种分层是可以扩展的,能够适应Internet
不断扩展的需要。
抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上
看,.Net类可以视为包含3个层次:请求/响应层、应用协议层、传
输层。WebReqeustfnWebResponse代表了请求/响应层,支持、
Tcp和Udp的类组成了应用协议层,而Socket类处于传输层。
传输层位于这个构造的最底层,当其上面的应用协议层和请求/响应
层不能满足应用程序的特殊需要时,就需要使用这一层进展Socket
套接字编程。
而在.Net中,System.Net.Sockets命名空间为需要严密控制网络
访问的开发人员提供了WindowsSockets(Winsock)接口的托
管实现。System.Net命名空间中的所有其他网络访问类都建设在
该套接字Socket实现之上,如TCPQient、TCPListener和
UDPCIient类封装有关创立到Internet的TCP和UDP连接的
详细信息;Networkstream类那么提供用于网络访问的根基数据流
等,常见的许多Internet服务都可以见到Socket的踪影,如
Telnet、、EmaiLEcho等,这些服务尽管通讯协议Protocol的定
义不同,但是其根基的传输都是采用的Socket。
其实,Socket可以象流Stream一样被视为一个数据通道,这个通
道架设在应用程序端(客户端)和远程服务器端之间,而后,数据的
读取(接收)和写入(发送)均针对这个通道来进展。
可见,在应用程序端或者服务器端创立了Socket对象之后,就可以
使用Send/SentTo方法将数据发送到连接的Socket,或者使用
Receive/ReceiveFrom方法接收来自连接Socket的数据;
针对Socket编程,.NET框架的Socket类是Winsock32API
提供的套接字服务的托管代码版本。其中为实现网络编程提供了大量
的方法,大多数情况下,Socket类方法只是将数据封送到它们的本
机Win32中并处理任何必要的安全检查。如果你熟悉Winsock
API函数,那么用Socket类编写网络程序会非常容易,当然,如果
你不曾接触过,也不会太困难,跟随下面的讲解,你会觉察使用
Socket类开发windows网络应用程序原来有规可寻,它们在大多
数情况下遵循大致一样的步骤。
在使用之前,你需要首先创立Socket对象的实例,这可以通过
Socket类的构造方法来实现:
publicSocket(AddressFamilyaddressFamilyzSocketType
socketTypezProtocolTypeprotocolType);
其中,addressFamily参数指定Socket使用的寻址方案,
socketType参数指定Socket的类型,protocolType参数指定
Socket使用的协议。
下面的例如语句创立一个Socket,它可用于在基于TCP/IP的网
络(如Internet)上通讯。
Sockets=newSocket(AddressFamily.InterNetwork,
SocketType.Stream,Protocollype.Tcp);
假设要使用UDP而不是TCP,需要更改协议类型,如下面的例如
所示:
Sockets=newSocket(AddressFamily.InterNetwork,
SocketType.Dgram,ProtocolType.Udp);
一旦创立Socket,在客户端,你将可以通过Connect方法连接到
指定的服务器,并通过Send/SendTo方法向远程服务器发送数据,
而后可以通过Receive/ReceiveFrom从服务端接收数据;而在服
务器端,你需要使用Bind方法绑定所指定的接口使Socket与一个
本地终结点相联,并通过Listen方法侦听该接口上的请求,当侦听
到用户端的连接时,调用Accept完成连接的操作,创立新的Socket
以处理传入的连接请求。使用完Socket后,记住使用Shutdown
方法禁用Socket,并使用Close方法关闭Socket。其间用到的
方法/函数有:
Socket.Connect方法:建设到远程设备的连接
publicvoidConnect(EndPointremoteEP)(有重载方法)
publicvoidClose();
可以看出,以上许多方法包含EndPoint类型的参数,在Internet
中,TCP/IP使用一个网络地址和一个服务端口号来唯一标识设备。
网络地址标识网络上的特定设备;端口号标识要连接到的该设备上的
特定服务。网络地址和服务端口的组合称为终结点,在.NET框架
中正是由EndPoint类表示这个终结点,它提供表示网络资源或服
务的抽象,用以标志网络地址等信息。.Net同时也为每个受支持的
地址族定义了EndPoint的子代;对于IP地址族,该类为
IPEndPointoIPEndPoint类包含应用程序连接到主机上的服务所
需的主机和端口信息,通过组合服务的主机IP地址和端口号,
IPEndPoint类形成到服务的连接点。
用到IPEndPoint类的时候就不可防止地涉及到计算机IP地址,.Net
中有两种类可以得到IP地址实例:
IPAddress类:IPAddress类包含计算机在IP网络上的地址。
其Parse方法可将IP地址字符串转换为IPAddress实例。下面
的语句创立一个IPAddress实例:
IPAddressmyIP=IPAddress.Parse(,,192,168.1.2n);
Dns类:向使用TCP/IPInternet服务的应用程序提供域名服
务。其Resolve方法查询DNS服务器以将用户友好的域名(如
"host.contoso”)映射到数字形式的Internet地址(如
192.168.1.l)oResolve方法返回一个IPHostEnty实例,该实
例包含所请求名称的地址和别名的列表。大多数情况下,可以使用
AddressList数组中返回的第一个地址。下面的代码获取一个
IPAddress实例,该实例包含服务器host.contoso的IP地
址。
IPHostEntryipHostlnfo=Dns.Resolve("host.contoso
");
IPAddressipAddress=ipHostlnfo.AddressList[O];
你也可以使用GetHostName方法得到IPHostEntry实例:
IPHosntEntry
hostInfo=Dns.GetHostByName("host.contoso")
在使用以上方法时,你将可能需要处理以下几种异常:
SocketException异常:访问Socket时操作系统发生错误引发
ArgumentNullException异常:参数为空引用引发
ObjectDisposedException异常:Socket已经关闭引发
在掌握上面得知识后,下面的代码将该服务器主机(host.contoso
的IP地址与端口号组合,以便为连接创立远程终结点:
IPEndPointipe=newIPEndPoint(ipAddress,11000);
确定了远程设备的地址并选择了用于连接的端口后,应用程序可以尝
试建设与远程设备的连接。下面的例如使用现有的IPEndPoint实
例与远程设备连接,并捕获可能引发的异常:
try{
s.Connect(ipe);〃尝试连接
}
〃处理参数为空引用异常
catch(ArgumentNullExceptionae){
Console.WriteLine("ArgumentNullException:{0}"z
ae.ToString());
}
〃处理操作系统异常
catch(SocketExceptionse){
nu
Console.WriteLine(SocketException:{0}z
se.ToStringf));
}
catch(Exceptione){
Console.WriteLine("Unexpectedexception:{0}"z
e.ToString());
}
需要知道的是:Socket类支持两种基本模式:同步和异步。其区
别在于:在同步模式中,对执行网络操作的函数(如Send和
Receive)的调用一直等到操作完成后才将控制返回给调用程序。在
异步模式中,这些调用立即返回。
另外,很多时候,Socket编程视情况不同需要在客户端和服务器端
分别予以实现,在客户端编制应用程序向服务端指定端口发送请求,
同时编制服务端应用程序处理该请求,这个过程在上面的阐述中已经
提及;当然,并非所有的Socket编程都需要你严格编写这两端程序;
视应用情况不同,你可以在客户端构造出请求字符串,服务器相应端
口捕获这个请求,交由其公用服务程序进展处理。以下事例语句中的
字符串就向远程主机提出页面请求:
stringGet="GET//l.l\r\nHost:"+server+
"\r\nConnection:Close\r\n\r\n";
远程主机指定端口承受到这一请求后,就可利用其公用服务程序进展
处理而不需要另行编制服务器端应用程序。
综合运用以上阐述的使用VisualC#进展Socket网络程序开发的知
识,下面的程序段完整地实现了Web页面下载功能。用户只需在窗
体上输入远程主机名(Dns主机名或以点分隔的四局部表示法格式
的IP地址)和预保存的本地文件名,并利用专门提供服务的80端
口,就可以获取远程主机页面并保存在本地机指定文件中。如果保存
格式是.htm格式,你就可以在Internet浏览器中翻开该页面。适
当添加代码,你甚至可以实现一个简单的浏览器程序。
实现此功能的主要源代码如下:
〃”开场“按钮事件
privatevoidbuttonl_Click(objectsender;
System.EventArgse){
〃取得预保存的文件名
stringfileName=textBox3.Text.Trim();
〃远程主机
stringhostName=textBoxl.Text.Trim();
〃端口
intport=Int32,Parse(textBox2.Text.Trim());
〃得到主机信息
IPHostEntryipInfo=Dns.GetHostByName(hostName);
//取彳导IPAddress[]
IPAddress[]ipAddr=ipInfo.AddressList;
〃得到ip
IPAddressip=ipAddr[O];
〃组合出远程终结点
IPEndPointhostEP=newIPEndPoint(ipzport);
〃创立Socket实例
Socketsocket=new
SocketCAddressFamily.InterNetwork^ocketType.Streamer
otocolType.Tcp);
try
{
〃尝试连接
socket.Connect(hostEP);
}
catch(Exceptionse)
{
MessageBox.Show("连接错误"+se.Message,”提示信息
,MessageBoxButtons.RetryCancel,MessageBoxIcon.Inf
ormation);
}
〃发送给远程主机的请求内容串
stringsendStr="GET//l.l\r\nHost:"+hostName
+
"\r\nConnection:Close\r\n\r\n";
〃创立bytes字节数组以转换发送串
byte[]bytesSendStr=newbyte[1024];
〃将发送内容字符串转换成字节byte数组
bytesSendStr=Encoding.ASCILGetBytes(sendStr);
try
{
〃向主机发送请求
socket.Send(bytesSendStr;bytesSendStr.Length,0);
}
catch(Exceptionce)
<
MessageBox,Show("发送错误:"+ce.Messdge,”提示信息
,MessageBoxButtons.RetryCancelzMessageBoxIcon.Inf
ormation);
}
〃声明接收返回内容的字符串
stringrecvStr="";
〃声明字节数组,一次接收数据的长度为1024字节
byte[]recvBytes=newbyte[1024];
〃返回实际接收内容的字节数
intbytes=0;
〃循环读取,直到接收完所有数据
while(true)
{
bytes=socket.Receive(recvBytes,recvBytes.Length,0);
〃读取完成后退出循环
if(bytes<=0)
break;
〃将读取的字节数转换为字符串
recvStr+=Encoding.ASCII.GetString(recvBytes,O,bytes);
}
〃将所读取的字符串转换为字节数组
byte[]content=Encoding.ASCII.GetBytes(recvStr);
try
{
〃创立文件流对象实例
FileStreamfs=new
FileStream(fileName,FileMode.OpenOrCreate/FileAccess.Re
adWrite);
〃写入文件
fs.Write(contentzO,content.Length);
}
catch(Exceptior)fe)
{
MessageBoxShow("文件创立/写入错误:"+fe.Message,”
提示信息
",MessageBoxButtons.RetryCancel,MessageBoxIcon.Infor
mation);
}
〃禁用Socket
socket.Shutdown(SocketShutdown.Both);
〃关闭Socket
socket.Close();
}
}
程序在WindowsXP中文版、.NetFrameworkd中文正式版、
VisualStudio.Net中文正式版下调试通过
VisualC#.Net网络程序开发Tcp篇
前一篇?VisualC#.Net网络程序开发-Socket篇?中说到:支
持、Tcp和Udp的类组成了TCP/IP三层模型(请求响应层、应
用协议层、传输层)的中间层-应用协议层,该层的类比位于最底层的
Socket类提供了更高层次的抽象,它们封装TCP和UDP套接字
的创立,不需要处理连接的细节,这使得我们在编写套接字级别的协
议时,可以更多地尝试使用TCPCIient、UDPCIient和
TcpListener,而不是直接向Socket中写。它们之间的这种层次关
系示意如下:
可见,TcpCIient类基于Socket类构建,这是它能够以更高
的抽象程度提供TCP服务的根基。正因为这样,许多应用层上的通
讯协议,比方FTP(FileTransfersProtocol)文件传输协议、
(HypertextTransfersProtocol)超文本传输协议等都直接创立在
TcpCIient等类之上。
TCPCIient类使用TCP从Internet资源请求数据。TCP协议
建设与远程终结点的连接,然后使用此连接发送和接收数据包。TCP
负责确保将数据包发送到终结点并在数据包到达时以正确的顺序对
其进展组合。
从名字上就可以看出,TcpCIient类专为客户端设计,它为TCP
网络服务提供客户端连接。TcpCIient提供了通过网络连接、发送和
接收数据的简单方法。
假设要建设TCP连接,必须知道承载所需服务的网络设备的地
址(IPAddress)以及该服务用于通讯的TCP端口(Port)。
Internet分配号码机构(InternetAssignedNumbers
Authority,IANA)定义公共服务的端口号(你可以访问:〃
/assignments/port-numbers获得这方面更详细的资
料)。IANA列表中所没有的服务可使用1,024到65,535这一范
围中的端口号。要创立这种连接,你可以选用TcpQient类的三种构
造函数之一:
1、publicTcpCIient。当使用这种不带任何参数的构造函数时,
将使用本机默认的ip地址并将使用默认的通信端口号Oo这样情况
下,如果本机不止一个ip地址,将无法选择使用。以下语句例如了
若何使用默认构造函数来创立新的TcpCIient:
TcpCIienttcpCIientC=newTcpClient();
2、publicTcpClient(IPEndPoint)使用本机IPEndPoint创立
TcpCIient的实例对象。上一篇介绍过了,IPEndPoint将网络端点
表示为IP地址和端口号,在这里它用于指定在建设远程主机连接时
所使用的本地网络接口(IP地址)和端口号,这个构造方法为使用
本机IPAddress和Port提供了选择余地。下面的语句例如了若何使
用本地终结点创立TcpCIient类的实例:
IPHostEntryipInfo=Dns.GetHostByName(n
“);〃主机信息
IPAddressList[]ipList=ipInfo.AddressList;//IP地址数组
IPAddressip=ipList[O];〃多IP地址时一般用第一个
IPEndPointipEP=newIPEndPoint(ip,4088);〃得到网络终
结点
try{
TcpCIienttcpCIientA=newTcpClient(ipLocalEndPoint);
?
catch(Exceptione){
Console.WriteLine(e.ToStringO);
}
到这里,你可能会感到困惑,客户端要和服务端创立连接,所指
定的IP地址及通信端口号应该是远程服务器的呀!事实上确实如此,
使用以上两种构造函数,你所实现的只是TcpCIient实例对象与IP
地址和Port端口的绑定,要完成连接,你还需要显式指定与远程主
机的连接,这可以通过TcpCIient类的Connect方法来实现,
Connet方法使用指定的主机名和端口号将客户端连接到远程主
机:
1)、publicvoidConnect(IPEndPoint);使用指定的远程网络
终结点将客户端连接到远程TCP主机。
publicvoidConnect(IPAddress,int);使用指定的IP地址
和端口号将客户端连接到TCP主机。
publicvoidConnect(string,int);将客户端连接到指定主机
上的指定端口。
需要指出的是,Connect方法的所有重载形式中的参数
IPEndPoint网络终
结点、IPAddress以及表现为string的Dns主机名和int指出
的Port端口均指的是远程服务器。
以下例如语句使用主机默认IP和Port端口号0与远程主机建设
连接:
TcpCIienttcpCIient=newTcpClient();〃创立TcpCIient对
象实例
try{
tcpCIient.Connect("contoso”,11002);〃建设连接
}
catch(Exceptione){
Console.WriteLine(e.ToStringO);
?
3、publicTcpClient(string,int);初始化TcpCIient类的新实
例并连接到指定主机上的指定端口。与前两个构造函数不一样,这个
构造函数将自动建设连接,你不再需要额外调用Connect方法,其
中string类型的参数表示远程主机的Dns名,如:o
以下例如语句调用这一方法实现与指定主机名和端口号的主机相
连:
try{
TcpCIienttcpCIientB=newTcpClient("",
4088);
}
catch(Exceptione){
Console.WriteLine(e.ToStringO);
}
前面我们说,TcpCIient类创立在Socket之上,在Tcp服务方面
提供了更高层次的抽象,表达在网络数据的发送和承受方面,是
TcpCIient使用标准的Stream流处理技术,使得它读写数据更加方
便直观,同时,.Net框架负责提供更丰富的构造来处理流,贯穿于
整个.Net框架中的流具有更广泛的兼容性,构建在更一般化的流操
作上的通用方法使我们不再需要困惑于文件的实际内容(HTML、
XML或其他任何内容),应用程序都将使用一致的方法
(Stream.Write>Stream.Read)发送和接收数据。另外,流在
数据从Internet下载的过程中提供对数据的即时访问,可以在局部
数据到达时立即开场处理,而不需要等待应用程序下载完整个数据
集。.Net中通过Networkstream类实现了这些处理技术。
Networkstream类包含在.Net框架的System.Net.Sockets
命名空间里,该类专门提供用于网络访问的根基数据流。
Networkstream实现通过网络套接字发送和接收数据的标准,Net
框架流机制。Networkstream支持对网络数据流的同步和异步访
问。Networkstream从Stream继承,后者提供了一组丰富的用
于方便网络通讯的方法和属性。
同其它继承自抽象基类Stream的所有流一样,
Networkstream网络流也可以被视为一个数据通道,架设在数据来
源端(客户Oient)和接收端(服务Serve门之间,而后的数据读取
及写入均针对这个通道来进展。
,Net框架中,Networkstream流支持两方面的操作:
1、写入流。写入是从数据构造到流的数据传输。
2、读取流。读取是从流到数据构造(如字节数组〕的数据传输。
与普通流Stream不同的是,网络流没有当前位置的统一•概念,
因此不支持查找和对数据流的随机访问。相应属性CanSeek始终返
回false,而Seek和Position方法也将引发
NotSupportedException0
基于Socket上的应用协议方面,你可以通过以下两种方式获取
Networkstream网络数据流:
1>使用Networkstream构造函数:public
NetworkStream(Socket,FileAccess,bool);(有重载方法),它
用指定的访问权限和指定的Socket所属权为指定的Socket创
立Networkstream类的新实例,使用前你需要创立Socket对象
实例,并通过Socket.Connect方法建设与远程服务端的连接,而
后才可以使用该方法得到网络传输流。例如如下:
Sockets=new
SocketCAddressFamily.InterNetwork^ocketType.Streamer
。1。8^^巳1^);〃创立客户端Socket对象实例
try{
s.Connect(H”,4088);〃建设与远程主机的连接
}
catch(Exceptione){
MessageBox.show("连接错误:"+e.Message);
?
try{
Networkstreamstream=new
NetworkStream(s,FileAccess.ReadWrite,false);〃取得网络传
输流
}
2、通过TcpCIient.GetStream方法:publicNetworkstream
etStream();它返回用于发送和接收数据的根基网络流
NetworkstreamoGetStream通过将根基Socket用作它的构
造函数参数来创立Networkstream类的实例。使用前你需要先创
TcpCIient对象实例并建设与远程主机的连接,例如如下:
TcpCIienttcpCIient=newTcpQient();〃创立TcpCIient对
象实例
Try{
tcpCIient.Connect("”,4088);〃尝试与远程主
机相连
}
catch(Exceptione){
MessageBox,Show("连接错误:”+e.Message);
}
try{
Networkstreamstream=tcpClient.GetStream();//^IX
网络传输流
}
catch(Exceptione)
{
MessageBox.Show("TcpClient错误:"+e.Message);
}
通过以上方法得到Networkstream网络流之后,你就可以使用
标准流读写方法Write和Read来发送和承受数据了。
以上是.Net下使用TcpCIient类实现客户端编程的技术资料,为
了向客户端提供这些服务,我们还需要编制相应的服务端程序,前一
篇?VisualC#.Net网络程序开发-Socket篇?上曾经提到,Socket
作为其他网络协议的根基,既可以面向客户端开发,也可以面向服务
端开发,在传输层面上使用较多,而在应用协议层面上,客户端我们
采用构建于Socket类之上的TcpCIient取代Socket;相应地,构
建于Socket之上的TcpListener提供了更高理念级别的TCP服
务,使得我们能更方便地编写服务端应用程序。正是因为这样的原因,
像FTP和这样的应用层协议都是在TcpListener类的根基
上建设的。
.Net中的TCPListener用于监视TCP端口上的传入请求,通过
绑定本机IP地址和相应端口(这两者应与客户端的请求一致)创立
TcpListener对象实例,并由Start方法启动侦听;当TcpListener
侦听到用户端的连接后,视客户端的不同请求方式,通过
AcceptTcpCIient方法承受传入的连接请求并创立TcpCIient以
处理请求,或者通过AcceptSocket方法承受传入的连接请求并创
立Socket以处理请求。最后,你需要使用Stop关闭用于侦听传
入连接的Socket,你必须也关闭从AcceptSocket或
AcceptTcpCIient返回的任何实例。这个过程详细讲解如下:
首先,创立TcpListener对象实例,这通过TcpListener类的构
造方法来实现:
publicTcpListener(port);〃指定本机端口
publicTcpListene「(IPEndPoint)//指定本机终结点
publicTcpListener(IPAddress,port)〃指定本机IP地址及端
□
以上方法中的参数在前面屡次提到,这里不再细述,唯一需要提
醒的是,这些参数均针对服务端主机。下面的例如演示创立
TcpListener类的实例:
IPHostEntryipInfo=Dns.Resolve("");//主机信
息
IPAddressList[]ipList=ipInfo.IPAddressList;//IP数组
IPAddressip=ipList[O];//IP
try{
TcpListenertcpListener=newTcpListener(ipAddress,
4088);〃创立TcpListener对象实例以侦听用户端连接
}
catch(Exceptione){
MessageBox.Show(HTcpListener错误:"+e.Message);
}
随后,你需要调用Start方法启动侦听:
publicvoidStart();
其次,当侦听到有用户端连接时,需要承受挂起的连接请求,这
通过调用以下两方法之一来完成连接:
publicSocketAcceptSocket();
publicTcpCIientAcceptTcpClient();
前一个方法返回代表客户端的Socket对象,随后可以通过
Socket类的Send和Receive方法与远程计算机通讯;后一个
方法返回代表客户端的TcpCIient对象,随后使用上面介绍的
TcpCIient.GetStream方法获取TcpCIient的根基网络流
Networkstream,并使用流读写Read/Write方法与远程计算机通
讯。
最后,请记住关闭侦听器:publicvoidStop();
同时关闭其他连接实例:publicvoidClose();
下面的例如完整表达了上面的过程:
booldone=false;
TcpListenerlistener=newTcpListener(13);//创立
TcpListener对象实例(13号端口提供时间服务)
listener.Start();〃启动侦听
while(!done){〃进入无限循环以侦听用户连接
TcpCIientclient=listener.AccnptTcpClient();〃侦听到连
接后创立客户端连接TcpCIient
Networkstreamns=client.GetSt「eam();〃得到网络传输
流
byte[]byteTime=
Encoding.ASCII.GetBytes(DateTime.Now.ToString());//预
发送的内容(此为服务端时间)转换为字节数组以便写入流
try{
ns.Write(byteTime,0,byteTime.Length);//写入流
ns.Close。;〃关闭流
client.Qose();〃关闭客户端连接
}
catch(Exceptione){
MessageBoxShow(“流错误:"+e.Message)
}
综合运用上面的知识,下面的实例实现了简单的网络通讯-
双机互连,针对客户端和服务端分别编制了应用程序。客户端创立到
服务端的连接,向远程主机发送连接请求连接信号,并发送交谈内容;
远程主机端接收来自客户的连接,向客户端发回确认连接的信号,同
时接收并显示客户端的交谈内容。在这个根基上,发挥你的创造力,
你完全可以开发出一个基于程序语言(C#)级的聊天室!
客户端主要源代码:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物标志物在药物临床试验中的精准医疗策略-1
- 生物打印技术在牙周组织再生中的细胞因子调控
- 生物制剂失应答后IBD的快速反应评估方法
- 生物3D打印墨水的细胞凋亡抑制策略
- 生活质量终点在慢性病药物早期研发中的预测价值
- 人力资源岗面试题集及答案详解
- 深度解析(2026)《GBT 19465-2004工业用异丁烷 (HC-600a)》
- 深度解析(2026)《GBT 19401-2003客运拖牵索道技术规范》
- 瓣膜病合并感染性心内膜炎治疗策略
- 电商行业运营经理面试技巧与题库
- MOOC 光影律动校园健身操舞-西南交通大学 中国大学慕课答案
- 英语雅思词汇表
- 墨尔本餐饮创业计划书
- 重型颅脑损伤患者的临床观察与护理
- CNG母站设备操作规程和作业指导书
- 如何长高课件
- 23J916-1:住宅排气道(一)
- (新平台)国家开放大学《农村社会学》形考任务1-4参考答案
- 献身国防事业志愿书范文
- 青岛版科学四年级上册知识点
- 2023年06月北京第一实验学校招考聘用笔试题库含答案解析
评论
0/150
提交评论