Delphi的Socket编程要分几步_第1页
Delphi的Socket编程要分几步_第2页
Delphi的Socket编程要分几步_第3页
Delphi的Socket编程要分几步_第4页
Delphi的Socket编程要分几步_第5页
免费预览已结束,剩余8页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Delphi 的 Socket 编程要分几步?ClientSocket 和 ServerSocket几个重要的属性:l.client 和 server 都有 port 属性,需要一致才能互相通信2.client 有 Address 属性,使用时填写对方(server)的 IP 地址几个重要的事件:client:OnRead 事件,当 client 收到消息时在 OnRead 事件中可以获得 server 发送过来消息。Server:OnClientRead 事件,与上述 client 的作用相同发送信息:clien 使用 SocketClient1.Socket.SendBuf(char 类型

2、的数组,信息长度);server 使用 SocketServer1.Socket.Connection0.SendBuf(char 类型的数组,信息长度);接收信息clien 使用 SocketClient1.Socket.ReceiveBuf(char 类型的数组,信息长度);server 使用 SocketServer1.Socket.Connection0.ReceiveBuf (char 类型的数组, 信息长度) ;使用 sockets:Socket 控件让你建立一个利用 TCP/IP 和有关的协议与其他系统进行通信的应用。使用 Sockets,你能够读和写通过它连接的其他机器,而不用

3、担心实际的网络软件的相关细节。Sockets提供基于 TCP/IP 协议的连接。Delphi 提供通过网络服务器或客户应用程序去读和写其他的系统的功能。一个服务或客户程序通常专注于一个单一的服务,如超文本传送协议(HTTP 或文件传输协议(FTP%使用 serversockets,一个应用程序可以通过这些服务中的一个去连接一个希望使用服务的客户程序。Clientsockets 允许一个应用使用这些服务中的一个去连接提供这个服务的服务应用。使用 sockets 去写应用程序,你必须理解下面这些知识:一、服务工具当你需要写网络服务或客户应用时,Sockets 提供一种接合。对于许多服务,象 HTT

4、P或 FTP,第三方服务商提供这些服务已经相当有效。有些甚至随着操作系统捆绑而来,以便不用你自己写。然而,当你想更多的控制服务的实现,比如想让你的应用程序与网络通信更加紧密,或当没有一个服务能提供你特殊需要的服务时,你可能想建立你自己的服务或客户应用。例如,工作在分布式 datasets 时,你可能想为数据库写一层与其他系统通信的应用。想使用 Sockets 实现一个服务,你必须理解:1 .服务协议在你写一个网络服务或客户程序前,你必须明白你的应用将提供或使用什么服务。你的网络应用必须支持许多服务的标准协议。如果你为标准的服务例如 HTTPFTP 写网络应用,你必须先理解与其他系统通信所使用的

5、协议。特殊服务细节你必须看提供的或使用的文档。如果你的应用程序提供一个新的服务与其他系统通信,第一步是为这个服务的服务端和客户端设计通信协议。什么信息将发送?如何整理这些信息?如何对这些信息进行编码?应用程序通信经常的,你的网络服务端或客户端应用程序要提供一层在网络软件和一个应用之间使用的服务。例如,一个 HTTP 服务站点在 internet 与一个 Web 服务应用之间为 HTTP 请求信息提供内容和应答。在你的网络应用(或客户应用)和网络软件之间 Sockets 提供一个接口。你必须提供一个接口,在你的应用程序与应用间使用。你可以拷贝第三方服务商提供的标准 API(例如ISAPD,或你可

6、以设计和发布你自己的 API.2 .理解服务和端口许多标准服务都有关联的、指定的端口号。当执行服务时,你可以为服务考虑一个端口号。如果你实现一个标准服务,Windowssocketobjects 提供一些方法让你为服务寻找端口号。如果提供一个新的服务,在基于 Windows95 或 NT 机器上,你能够在文件 Services中为你的服务指定一个相关联的端口号。设置 Services 文件的更多信息请看微软的 WindowsSockets 文档。二、Socket 连接的类型Socket 连接可以分成三个基本的类型,它们反映了如何开始连接和本地 Socket 连接是什么。这三个类型是:1 .客户

7、端连接客户端连接是一个本地系统的客户端 socket 与一个远程系统上的服务端 Socket 连接。客户端连接由客户端 Socket 开始。首先,客户端 Socket 必须描述它想连接到的服务端Socket.接着客户端 socket 查找服务端 socket,当找到服务器时,就要求连接。服务端 socket 可能不能完成正确的连接。服务器 sockets 维持一个客户端请求队列,在他们有时间时完成连接。当服务端 socket 接受客户端连接,服务端 socket 将向它想连接的客户 socket 发送一个完整的描述,客户端的连接完成。2 .监听连接服务器 socket 不会主动去定位客户端,他

8、们形成被动的半连接状态,监听来自客户端的请求。服务器 sockets 形成一个队列,存放它们听到的连接请求。这个队列记录着客户端连接请求,就象他们已连接进来一样。当服务器 sockets 同意客户端连接请求时,它将形成一个新的 socket 去连接客户端,因此这个监听连接能保持开放状态允许其他客户端的连接请求。3 .服务端连接当监听 socket 同意一个客户端请求时,服务器端 socket 形成一个服务器连接。当服务器端同意连接时,向客户端发送一个服务端 socket 描述以完成连接,当客户端 socket收到这个描述时这个连接得到确认,连接完成。一但连接到客户端的 Socket 完成,服务

9、端连接就不能识别从一个客户端来的连接。末端双方有同样的能力去接收同样的事件类型。只有监听(listening)连接是根本不同的,它只有一个单一的末端。三、sockets 描述Sockets 让你的网络应用软件通过网络与其他系统进行通信。在网络连接中每个 socket 可以看成一个终端点。它有一个指定的地址。*这个系统正在运行*它理解的接口类型*用来连接的端口一个完整的 socket 连接描述,你必须提供 sockets 在连接两端的地址。在你开始一个 socket连接前,你必须完整的描述你想得到的连接。有些信息可以从你的应用软件运行的系统平台上得到。例如,你不需要描述一个客户端 socket

10、的本地 IP 地址-这个信息可以从操作系统上获得。你必须提供你工作所依靠的 socket 的类型的信息。客户端 socket 必须描述他们想连接的服务器。监听服务器 sockets 必须描述他们提供反应的服务器的端口。一个socket 连接终端的完整描述包括两部分:1.1 P 地址主机是这样一个系统,它运行着包含有 socket 的应用程序。你必须描述主机给socket,通过给出主机的 IP 地址来完成这个描述。IP 地址是一个有四个数字(byte)值的,在 internet上使用的标准点分十进制字符串。例如:一个简单的系统可以支持多于一个的 IP 地址。IP 地址通常难

11、于记忆并且容易打错。一个可供选择的方法是使用主机名。主机名就是 IP 地址的别名,它就是你常看到的统一资源定位符(URL)它是一个字符串,包括了协议、服务和域名。例如 http:/许多内部网提供给主机的名字对应的系统 IP 地址是 internet 的 IP 地址。在windows95 和 NT 机器上,如果一个主机名不能用,你可以在 HOSTS 文件中为你的本地 IP地址(这个本地 IP 地址应该是指你想连接的主机 IP 地址)建立一个进入的名字。关于 HOST 成件的更多彳 t 息请看 WINDOWSSOCKETS 勺文档。服务器 sockets 不需要指定主机。本地 IP 地址可以从系统

12、中读到。如果本地系统支持多于一个的 IP 地址, 服务器 sockets 将同时在所有的 IP 地址上监听客户端请求。 当一个服务器 socket同意一个连接,客户端提供一个远程 IP 地址。客户端 sockets 必须通过提供主机名或者 IP 地址来指定远程主机。在主机名和 IP 地址间作一个选择许多应用软件使用一个主机名去指定一个系统。主机名容易记住并且容易检查错误。进一步讲,服务器能改变系统或与 IP 地址关联的特殊的主机名。使用一个主机名,能够允许客户端通过主机名描述找到抽象的站点,即使主机使用一个新的 IP 地址。如果主机名是未知的,客户端 socket 必须指定服务器系统使用的 I

13、P 地址。通过给一个 IP 地址来指定服务器将更快。当你提供主机名时,socket 在定位服务器系统前,必须搜寻与这个主机名相关的 IP 地址。2.端口号虽然 IP 地址提供了足够的信息去找到 socket 连接中位于另一端的系统,但你还必需要为 Socket 连接指定一个端口号。没有端口号,一个系统在同一时间只能进行一个单一的连接。端口号是允许一个独立系统同时支持多个主机连接的唯一标识,每个连接都必须指定个端口号。在网络应用中,对于服务器工具来说端口号是一个数字代码。有一个习惯就是监听服务连接到他们自己固定的端口号上,以便他们能找到客户端 sockets.服务器 socket 监听为他们提供

14、服务的相关端口号。当他们允许给予一个客户端 socket 连接时,他们创建一个独立的 socket 连接,使用不同的专用的端口号。通过这个方法,能持续的监听相关服务的端口号。客户端 socket 使用一个专用的本地端口号,就不用其他的 socket 去寻找它们。他们指定他们想连接的服务器端 socket 的端口号,这样他们就能找到服务器应用程序。常常的,这个端口号是通过命名想连接的服务来间接指定的。四、使用 socket 控件Delphi 提供两个 socket 控件,客户端 sockets 和服务器 sockets.他们允许你的网络应用构成连接其他的机器和允许你通过这个连接来读写信息。与每个

15、 socket 控件相关联的是windowssocket 对象,它们在终端的的作用是一个实际的 socket 连接。socket 控件使用windowssocket 对象去封装 windowssocketAPI 调用,所以你的应用不用去关心连接建立的细节或管理socket 信息。如果你想利用 windowssocketAPI 调用或自定义连接细节,socket 控件提供了便利,你可以使用 windowssocket 对象的 properies,events 和方法。.使用客户端 sockets添加一个客户端 socket 控件(TClientSocket)至 U 你的 form 或 datam

16、odule 使你的应用成为一个 TCP/IP 客户。客户端 sockets 允许你指定你想连接的服务器 socket 和你希望服务器提供的服务。一但你描述你想得到的连接,你可以使用客户端 socket 控件去完成连接服务。每个客户端 socket 控件使用独立的客户端 windowssocket 对象(TClientWinSocket)去应答连接中的客户终端。使用客户端 sockets 去:A.指定想得到的服务客户端 socket 控件有一个数字 properties,允许你指定想连接的服务器系统和端口。你可以通过主机名来指定服务器系统,使用 Hostpropertyo如果你不知道主机名,或者

17、你关心找到服务器的速度,你可以指定服务器系统的 IP地址,通过使用 Addresspropertyo你必须指定 IP 地址或主机名中的一个。如果你两个都指定,客户端 socket 控件将使用主机名。除服务器系统外,你必须指定你的客户端 socket 将连接的在服务器系统上的端口。你能够直接使用 Portproperty 来指定服务端口号。或者直接在 Serviceproperty 使用想得到的服务的名字。如果你指定端口号和服务名,客户 socket 控件将使用服务名。.建立连接一旦你在客户 socket 控件中完成了设置描述你想连接的服务器的属性,你就可以进行连接,通过调用 Open 方法。如

18、果你想你的应用启动时自动建立连接,在设计时设置 Activeproperty 为 true,通过使用 ObjectInspector 来设置。C 取得关于连接的信息完成连接到服务器 socket 后,你可以使用你的客户 socket 控件相关的客户 windowssocketobject 去取得关于连接的信息。使用 Socketproperty 去访问 clientwindowssocketobject。windowssocketobject 有一个 properties,它能让你确定在连接的两端客户和服务器使用的地址和端口号。当使用一个 windowssocketAPI 调用时,你可以使用

19、SocketHandleproperty 区获得 socket 连接使用的 handle。你可以使用 Handleproperty 去访问 windows,以便接收来自 socket 连接的信息。AsyncStylesproperty 决定哪种信息类型是 windowshandle 要接收的。D.关闭连接当你完成通讯想关闭 socket 连接时,你能够通过调用 Close 方法来关闭连接。连接可能要由服务器端来关闭。如果是这种情况,你将收到一个 OnDisconnect 事件的通知。2.使用服务器 sockets添加一个服务端 socket 控件 ServerSocket 到你的 form 或

20、 datamodule 使你的应用成为一个TCP/IP 服务器。服务器 sockets 允许你指定你想提供的服务或你想用来监听客户端请求时使用的端口。你可以使用服务器 socket 控件去监听和允许客户连接请求。每个服务器 socket 控件使用一个单一的服务器 windowssocketObject(TServerWinSocket)去应答在服务器端监听到的连接。 它通常使用一个服务器客户 winodwssocketObject(TServerClientWinSocket)应答在服务器端每个活动的,连接着得到允许服务的客户 socketo 使用服务器 sockets 去:A.指定端口在你的

21、服务器 socket 能够监听客户请求之前,你必须指定一个端口给你的监听服务。你可以使用 Portproperty 来指定这个端口。如果你的服务器应用提供一个标准的服务,这个服务使用一个习惯使用的相关联的端口。你能够使用 Serviceproperty 直接指定端口号。使用 Serviceproperty 是一个好的主意,能够减少设置端口号时的错误。如果你既指定了 Portproperty,又指定了 Serviceproperty,服务 socket 将使用服务名。B.监听客户请求一旦你在 serversocket 控件上设置好你的端口号,你就能够通过在运行时调用 Open 方法来监听一个连接

22、。如果你希望你的应用程序能够在启动的时候自动监听连接,在设计的时候通过使用 ObjectInspector 设置 Active 属性为 true。C 连接到客户端。当服务端 socket 控件监听并接收到一个客户端连接请求时他们将自动接受这个请求。当你每次收到通知时,OnClientConnetc 事件将发生。D.取得关于连接的信息一但你的服务器 socket 打开了监听连接,你能够使用与你的服务器 socket 控件相关 联 的 服 务 器 windowssocketobject 来 取 得 关 于 连 接 的 信 息 。 使 用 Socketproperty 去 访 问serverwind

23、owssocketobject。windowssocketobject 有个属性能够让你找至 U 关于所有活动的客户socket 连接,这些客户 socket 是你通过服务器 socket 控件允许连接的。使用 Handle属性去存取 windows 通过 socket 连接收到的信息。每个活动的,连接到客户应用是通过服务、客户windowssocketbject(TServerClientWinSocket)封装的。你能够通过 serverwindowssocketobject 的连接属性来访问所有的这些。这些 serverclientwindowssocketobject 有些属性让你能够

24、决定哪些地址和端口号给连接的两端-客户和服务器 socket 使用。当你使用 windowssocketAPI 调用时,可以使用SocketHandle 属性去获得 socket 连接使用的 handle。你能够使用 Handle 属性去访问windows 从 socket 连接处得来的信息。AsyncStyles 属性决定 windowshandle 将接收哪种类型的信息。E 关闭连接当你决定关闭监听连接时,调用 Close 方法。这将关闭所有打开着的,连接到客户应用的连接,取消任何尚未同意的连接,接着关闭监听连接以便你的服务 socket 控件不在接受任何新的连接。当客户端关闭他们自己独立

25、的连接到你的 serversocket 的连接时,你可以在 OnClientDisconnect 事件中得到讯息。五、socket 事件的应答当使用 sockets 写应用程序时,大多数工作发生在 socket 控件的 handler 事件中。当通过 socket 连接开始读或写时,OnRead 和 OnWrite 事件在 non-blockingclientsockets 中发生从而通知 sockets.同样的,服务器 sockets(blockingornon-blocking)收到 OnClientRead 和 OnClientWrite 事件.当服务器结束一个连接时,客户 scoket

26、s 收到一个 OnDisconnect 事件.当客户端结束一个连接时,服务器 socket 收到一个 OnClientDisconnect 事件.另外,客户端 Sockets 和服务器端 socket 从连接中收到一个错误信息时,都将产生一个错误事件错误事件:客户 sockets 和服务器 sockets 通常会产生一个 OnError 事件,当他们从连接中收到一个错误信息的时候.你能够写一个 OnError 事件处理去响应这些错误信息.这个OnError 事件处理提供传送关于 socket 试图做什么的时候这个错误发生的信息,以及错误信息提供的错误代码.你可以在 OnError 事件处理中对

27、这个错误作出响应,并且把错误代码改为 0,以避免 socket 产生一个例外.当开始和完成事件发生时,socket 控件通常会收到一个事件号(numberofevents).如果你的应用程序需要改变 socket 开始操作的处理过程或通过连接开始读或写操作时,你将写事件 handlers 去应答这些 clientevents 和 serverevents.A.clientevents当一个客户 socket 打开一个连接时,以下事件发生:.一个 OnLookup 事件最先发生,它试图去定位 serversocket.在这里你不能改变Host,Address,Port,Service 属 性 去

28、 改 变 你 想 定 位 的 服 务 器 . 你 能 够 使 用 Socket 属 性 去 访 问clientwindowssocketobject,并且使用它的 SocketHandle 属性去调用 windowsAPI,以便改变 socket 的客户属性.例如,如果你想在客户应用软件中设置端口号,你必须在 serverclient 连接前做这件事.windowssocket 设置和初始化事件通知.当找到 serversocket 一个 OnConnecting 事件发生.在这事件中,windowsSocketobject可以利用的是通过 socket 属性提供关于连接的另一端的服务 soc

29、ket 的一些信息.这是获得实际使用来连接的端口和 IP 地址的第一个机会,它可能不同于从监听 socket 处同意连接时得到的端口或 IP 地址.服务器同意连接请求,客户端 socket 完成连接.当一个连接得到确定后, 一个 OnConnect 事件发生.如果你的 socket 立即开始通过连接读或写,就应写一个 OnConnect 事件 Handler 去作这件事.e8a09208%561-Numbered_fcfe13e4-12ab-4e1f-936b-ced77.服务器端事件(serverevents)服务器 socket 控件通过两种方式连接:监听连接和连接到客户应用.服务器 so

30、cket 收到这两个连接的所有事件.监听时事件Delphi 的 Socket 编程要分几步?当构成监听连接前,OnListen 事件发生.在这个时候你能够通过 socket 属性获得serverwindowssocketobject.你能够使用它的SocketHandle属性去改变 socket,在socket打开监听之前.例如,如果你想限定监听服务使用的 IP 地址,你可以在这个 OnListen 事件 Handler 中做.与客户端连接的事件当一个服务器 socket 同意一个客户连接请求时,接下来的事件发生:搀搀愀 愀攀愀 戀戀 戀昀戀攀愀攀攀昀 一甀洀戀攀爀攀搀开戀昀%25345 昀戀

31、昀 挀 戀搀 昀戀昀戀.服务器 socket 产生一个 OnGetSocket 事件, 通过 windowssockethandle 传送给连接的另一端的 socket.如果你想提供自己定义的 TServerClientWinSocketofdescendant,你可以在 OnGetSocket 事件 handler中建立,将被用来替代 TServerClientWinSocket.搀搀愀 愀攀愀 戀戀 戀昀戀攀愀攀攀昀 一甀洀戀攀爀攀搀开戀昀%25345 昀戀昀 挀 戀搀 昀戀昀戀.一个 OnAccept 事件发生,传送新的 TServerClientWinSocket 对象给事件句柄.这是

32、第一个要点,当你使用 TServerClientWinSocket 的属性去获得被连接中服务的那端的客户的信息时.搀搀愀 愀攀愀 戀戀 戀昀戀攀愀攀攀昀 一甀洀戀攀爀攀搀开戀昀%25345 昀戀昀 挀 戀搀 昀戀昀戀.如果服务类型是 stThreadBlocking,一个 OnGetThread 事件发生。如果你想提供自己定义的TServerClientThread 子类,你可以在 OnGetThread 事件句柄中建立一个,它将替代TServerClientThread.搀搀愀 愀攀愀 戀戀 戀昀戀攀愀攀攀昀 一甀洀戀攀爀攀搀开戀昀%25345 昀戀昀 挀 戀搀 昀戀昀戀.如果服务类型是 s

33、tThreadBlocking,一个 OnThreadStart 事件发生。当这个线程(thread)开始执行时.如果你想执行任何初始化这个线程,或调用一些 windowssocketAPI 在这线程开始通过连接读和写之前,应该使用 OnThreadStart 事件句柄.搀搀愀 愀攀愀 戀戀 戀昀戀攀愀攀攀昀 一甀洀戀攀爀攀搀开戀昀%25345 昀戀昀 挀 戀搀 昀戀昀戀.当客户端完成一个连接时,一个 OnClientConnect 事件发生.如果是 non-blocking 服务,你可能想开始通过 socket 连接在这端进行读或写操作.六、通过 Socket 连接进行读和写通过 socke

34、t 连接到其他机器的原因是想通过这些连接来读和写信息.什么信息是你要读和写的,或者当你想读和写时是依靠哪些 socket 连接的相关服务的.通过 sockets 进行读和写可以是异步的,所以在你的网络应用中不需要阻塞其他代码的执行。这是调用 non-blockingconnection.你也同样可以通过 blockingconnection,这时你的下一行代码的执行必须等到读或写操作完成A.Non-blocking连接,读和写是异步的,所以在你的网络应用中不需要阻塞其他代码的执行.建立一个 Non-blocking 连接:.在客户 socket 中设置 ClientType 属性为 ctNon

35、Blocking.在服务器 socket 中设置 ServerType 属性为 stNonBlocking.当连接是 non-blocking 时,连接的另一端企图读或写时读和写事件将把这个信息通知你的socket.读和写操作事件Non-blockingsockets 想通过连接读或写时,它会产生一个读和写操作事件通知你的 socket.在客户端 sockets,你可以在 OnRead 或 OnWrite 事件句柄中对这些事件做出反应.在服务器端 Scokets,可以在 OnClientRead 或 OnClientWrite 事件句柄中对这些事件做出反应.与socket 连接相关联的 win

36、dowssocketobject 在事件句柄的读或写中被当作一个参数.Windowssocketobject 提供一个方法号(numberofmethods)以允许你通过连接读或写.通过 socket 连接读,使用 ReceiveBuf 或 ReceiveText 方法.在使用 ReceiveBuf 方法前,使用Receivelength 方法去确定在连接的另一端 socket 准备发送白字节数(numberofbytes).通过 socket 连接写,使用 SendBuf,SendStream 或 SendText 方法.如果你通过 socket 发送信息后不再需要 socket 连接, 你

37、可以使用 SendStreamThenDrop 方法.SendStreamThenDrop 在写完所有的信息后将关闭 Socket 连接,它能够从 stream 读信息.如果你使用 SendStream 或SendStreamThenDrop 方法,不要释放 Streamobject,socket 在连接结束后会自动释放这个 Stream.注意:SendStreamThenDrop 将关闭一个独立的客户连接服务,而不是监听连接.B.Blockingconnections当你使用的连接是 Blocking 时,你的 Socket 必须通过连接发起读或写操作,胜过被动的等待从 socket 连接发

38、来的通知.当你的连接末端的读和写操作发生改变时使用 Blockingsocket.对于客户端 sockets,设置 ClientType 属性为 ctBlocking 以便构成一个blocingconnection.根据你的客户端应用想完成什么,你可能想建立一个执行线程去完成读或写操作,以便你的应用能够继续执行其他的线程,当它在等待通过连接读或写操作的完成.对 于 服 务 器 sockets, 设 置 ServerType 属 性 为 stThreadBlocking 以 便 构 成 一 个blockingconnection.因为blockingconnections在等待通过连接读或写信息

39、完成时挂起了其他代码的执行,服务器 socket 控件通常产生一个新的执行线程给每一个客户连接,当 ServerType 设置为stThreadBlocking 时.许多使用 Blocking 连接的应用都写使用线程(usingthreads.甚至如果你不使用线程你可能也想使用 TWinSocketStream 去读和写.1)usingthreads当使用一个 blockingconnection 进行读或写操作时,客户 sockets 不会自动产生一个新线程.如果你的客户应用程序没有什么事做,直到读或写信息完成,那么这正是你想要的.如果你的应用包括了一个用户界面,它还需要响应用户的操作,那么,你可能想产生一个独立的线程去读写.当服务器 sockets 形成一个 blocking 连接时,他们常常产生独立的线程给每一个客户连接,所以没有客户需要等待直到其他客户完成通过连接读或写操作.在默认,f#况下,服务器 sockets 使用 TS

温馨提示

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

评论

0/150

提交评论