利用Sockets
副标题#e#
利用sockets Socket控件让你成立一个操作TCP/IP和有关的协议与其他系统举办通信的应用。利用Sockets,你可以或许读和写通过它毗连的其他呆板,而不消担忧实际的网络软件的相关细节。Sockets提供基于TCP/IP协议的毗连。除此以外还能很好的事情,在其他相关的协议,譬喻Xerox Network System (XNS), Digital’s DEC net, or Novell’s IPX/SPX 家属。
C++ Builder提供你写网络处事器或客户应用措施去读和写其他的系统。一个处事或客户措施凡是专注于一个单一的处事如超文本传送协议(HTTP)或文件传输协议(FTP)。利用server sockets,一个应用措施可以提供这些处事中的一个去毗连一个但愿利用处事的客户措施。Client sockets答允一个应用利用这些处事中的一个去毗连提供这个处事的处事应用。
利用sockets去写应用措施,你必需领略下面这些常识:
一、处事东西
当你需要写网络处事或客户应用时,Sockets提供一种接合。对付很多处事,象HTTP或FTP,第三方处事商提供这些处事已经相当有效。有些甚至跟着操纵系统绑缚而来,以便不消你本身写。然而,当你想更多的节制处事的实现,如想让你的应用措施与网络通信越发细密,或当没有一个处事能提供你非凡需要的处事时,你大概想成立你本身的处事或客户应用。譬喻,事情在漫衍式data sets时,你大概想为数据库写一层与其他系统通信的应用。想利用Sockets实现一个处事,你必需领略:
1.处事协议
在你写一个网络处事或客户措施前,你必需大白你的应用将提供或利用什么处事。你的网络应用必需支持很多处事的尺度协议。假如你为尺度的处事譬喻HTTP,FTP写网络应用,或even finger or time,你必需先领略与其他系统通信所利用的协议。非凡处事细节你必需看提供的或利用的文档。
假如你的应用措施提供一个新的处事与其他系统通信,第一步是为这个处事的
处事端和客户端设计通信协议。什么信息将发送?如何整理这些信息?如何对这些信息举办编码?
应用措施通信
常常的,你的网络处事端或客户端应用措施要提供一层在网络软件和一个应用之间利用的处事。譬喻,一个HTTP处事站点在INternet与一个Web 处事应用之间为HTTP请求信息提供内容和应答。
在你的网络应用(或客户应用)和网络软件之间Sockets 提供一个接口。你必需提供一个接口,在你的应用措施与应用间利用。你可以拷贝第三方处事商提供的尺度API(譬喻ISAPI),或你可以设计和宣布你本身的API.
2.领略处事和端口
很多尺度处事都有关联的、指定的端标语。当 执行处事时,你可觉得处事思量一个端标语。假如你实现一个尺度处事, Windows socket objects 提供一些要领让你为处事寻找端标语。假如提供一个新的处事,在基于Windows 95 或 NT呆板上,你可以或许在文件Services中为你的处事指定一个相关联的端标语。配置Services文件的更多信息请看微软 的Windows Sockets文档。
二、Socket毗连的范例
Socket毗连可以分成三个根基的范例,它们反应了如何开始毗连和当地Socket 毗连是什么。这三个范例是:
1.客户端毗连
客户端毗连是一个当地系统的客户端socket与一个长途系统上的处事端Socket毗连。客户端毗连由客户端Socket开始。首先,客户端Socket必需描写它想毗连到的处事端Socket. 接着客户端socket查找处事端socket,当找随处事器时,就要求毗连。处事端socket大概不能完成正确的毗连。处事器sockets维持一个客户端请求行列,在他们有时间时完成毗连。当处事端socket接管客户端毗连,处事端socket将向它想毗连的客户socket发送一个完整的描写,客户端的毗连完成。
2.倾听毗连
处事器 socket不会去定位客户端,取代的,他们形成被动的,"半毗连"状态,倾听来自客户端的请求。处事器 sockets形成一个行列,存放 它们听到的毗连请求。这个行列记录着客户端毗连请求就象他们已毗连进来一样。当处事器sockets同意客户毗连请求时,它形成一个新的socket去毗连客户端,因此这个倾听毗连能保持开放状态答允其他客户端请求。
3.处事端毗连
当倾听socket同意一个客户端请求时,处事器端socket形成一个处事器毗连。当处事器端同意毗连时,向客户端发送一个处事端socket描写以完成毗连,当客户端socket收到这个描写时这个毗连获得确认,毗连完成。一但毗连到客户端的Socket完成,处事端毗连就不能识别从一个客户端来的毗连。结尾两边有同样的本领去吸收同样的事件范例。只有倾听(listening)毗连是基础差异的,它只有一个单一的结尾。
#p#副标题#e#
三、sockets描写
Sockets让你的网络应用软件通过网络与其他系统举办通信。在网络毗连中每个socket可以当作一个终端点。它有一个指定的地点。
*这个系统正在运行
*它领略的接口范例
*用来毗连的端口
#p#分页标题#e#
一个完整的socket毗连描写,你必需提供sockets 在毗连两头的地点。在你开始一个socket毗连前,你必需完整的描写你想获得的毗连。有些信息可以从你的应用
软件运行的系统平台上获得。譬喻,你不需要描写一个客户端socket的当地IP地点–这个信息可以从操纵系统上得到。你必需提供你事情所依靠的socket的范例的信息。客户端socket必需描写他们想毗连的处事器。侦听处事器sockets必需描写他们提供回响的处事器的端口。一个socket 毗连终端的完整描写包罗两部门:
1.IP地点
主机是这样一个系统,它运行着包括有socket的应用措施。你必需描写主机给socket,通过给出主机的IP地点来完成这个描写。IP地点是一个有四个数字(byte)值的,在尺度internet点付内的字符串。
譬喻123.197.1.2
一个简朴的系统可以支持多于一个的IP地点。IP地点凡是难于影象而且容易打错。一个可供选择的要领是利用主机名。主机名就是IP地点的别名,它就是你常看到的统一资源定位(URLs)。它是一个字符串,包罗了域名和处事。
譬喻 http://www.wsite.com
很多内部网提供应主机的名字对应的系统IP地点是internetIP地点。在windows95 和NT呆板上,假如一个主机名不能用,你可以在HOSTS文件中为你的当地IP地点(这个当地IP地点应该是指你想毗连的主机IP地点–zyqsj)成立一个进入的名字。
关于HOSTS文件的更多信息请看WINDOWS SOCKETS的文档。
处事器sockets不需要指定主机。当地IP地点可以从系统中读到。假如当地系统支持多于一个的IP地点,处事器sockets将同时在所有的IP地点上侦听客户端请求。当一个处事器socket同意一个毗连,客户端提供一个长途IP地点。客户sockets必需指定长途主机通过提供主机名可能IP地点。
在主机名和IP地点间作一个选择
很多应用软件利用一个主机名去指定一个系统。主机名容易记着和容易查抄排版错误。进一步讲,处事器能改变系统或与IP地点关联的非凡的主机名。利用一个主机名,可以或许答允客户端通过主机名描写找到抽象的站点,纵然主机利用一个新的IP地点。
假如主机名是未知的,客户socket必需指定处事器系统利用的IP地点。通过给一个IP地点来指定处事器将更快。当你提供主机名时,socket在定位处事器系统前,必需搜寻与这个主机名相关的IP地点。
2.端标语
固然IP得地点提供了足够的信息去找到socket毗连中位于另一端的系统,你凡是还需要指定谁人系统的端标语。没有端标语,一个系统在同一时间只能举办一个单一的毗连。端标语是独一标识那答允一个独立系统毗连到支持同时多个毗连的主机,每个毗连都必需指定一个端标语。
在网络应用中,对付处事器东西来说端标语是一个数字代码。有一个习惯就是侦听处事毗连到他们本身牢靠的端标语上,以便他们能找到客户端sockets.处事器socket监听为他们提供处事的相关端标语。当他们答允给以一个客户端socket毗连时,他们建设一个独立的socket毗连,利用差异的专用的端标语。通过这个要领,能一连的监听相关处事的端标语。
客户端socket利用一个专用的当地端标语,就不消其他的socket去寻找它们。他们指定他们想毗连的处事器端socket的端标语,这样他们就能找随处事器应用措施。经常的,这个端标语是通过定名想毗连的处事来间接指定的。
四、利用socket控件
C++Builder提供两个socket控件,客户端sockets和处事器sockets.他们答允你的网络应用组成毗连其他的呆板和答允你通过这个毗连来读写信息。与每个socket控件相关联的是windows socket工具,它们在终端的的浸染是一个实际的socket毗连。socket控件利用windows socket工具去封装windows socket API 挪用,所以你的应用不消去体贴毗连成立的细节或打点socket信息。
假如你想操作windows socket API挪用或自界说毗连细节,socket控件提供了便利,你可以利用windows socket工具的properies,events和要领。
1.利用客户端sockets
添加一个客户端socket控件(TClientSocket)到你的form或data module 使你的应用成为一个TCP/IP客户。客户sockets答允你指定你想毗连的处事器socket和你但愿处事器提供的处事。一但你描写你想获得的毗连,你可以利用客户socket控件去完成毗连处事。
每个客户socket控件利用独立的客户windows socket工具(TClientWinSocket)去应答毗连中的客户终端。利用客户sockets去:
A.指定想获得的处事
客户socket控件有一个数字properties,答允你指定想毗连的处事器系统和端口。你可以通过主机名来指定处事器系统,利用Host property。
#p#分页标题#e#
假如你不知道主机名,可能你体贴找随处事器的速度,你可以指定处事器系统的IP地点,通过利用 Address property。你必需指定IP地点和主机名中的一个。
假如你两个都指定,客户socket控件将利用主机名。除处事器系统外,你必需指定你的客户socket将毗连的在处事器系统上的端口。你可以或许直接利用Port property来指定处事端标语。可能直接在Service property利用想获得的处事的名字。假如你指定端标语和处事名,客户socket控件将利用处事名。
B.成立毗连
一旦你在客户socket控件中完成了配置描写你想毗连的处事器的属性,你就可以举办毗连,通过挪用Open要领。假如你想你的应用启动时自动成立毗连,在设计时配置Active property为true,通过利用Object Inspector来配置。
C.取得关于毗连的信息
完成毗连随处事器socket后,你可以利用与你的客户socket控件相关的客户windows socket object去取得关于毗连的信息。利用Socket property去会见client windows socket object。windows socket object 有一个properties,它能让你确定在毗连的两头客户和处事器利用的地点和端标语。
当利用一个windows socket API挪用时,你可以利用SocketHandle property区得到socket毗连利用的handle。你可以利用Handle property去会见windows,以便吸收来自socket毗连的信息。AsyncStyles property抉择哪种信息范例是windows handle要吸收的。
D.封锁毗连
当你完成通讯想封锁socket 毗连时,你可以或许通过挪用Close要领来封锁毗连。毗连大概要由处事器端来封锁。假如是这种环境,你将收到一个OnDisconnect 事件的通知。
2.利用处事器sockets
添加一个处事端socket控件(TServerSocket)到你的form或data module使你的应用成为一个TCP/IP处事器。处事器sockets答允你指定你想提供的处事或你想用来监听客户请求时利用的端口。你可以利用处事器socket控件去监听和答允客户毗连请求。每个处事器socket控件利用一个单一的处事器windows socket Object(TServerWinSocket)去应答在处事器端监听到的毗连。它凡是利用一个处事器客户winodws socket Object(TServerClientWinSocket)应答在处事器端每个勾当的,毗连着获得答允处事的客户socket。利用处事器sockets去:
A.指定端口
在你的处事器socket可以或许监听客户请求之前,你必需指定一个端口给你的监听处事。你可以利用Port property来指定这个端口。假如你的处事器应用提供一个尺度的处事,这个处事利用一个习惯利用的相关联的端口。你可以或许利用Service property直接指定端标语。利用Service property是一个好的主意,可以或许淘汰配置端标语时的错误。假如你既指定了Port property,又指定了Service property,处事socket将利用处事名。
B.监听客户请求
一旦你在server socket控件上配置好你的端标语,你就可以或许通过在运行时通过挪用Open要领来监听一个毗连。假如你但愿你的应用措施可以或许在启动的时候自动监听毗连,在设计的时候通过利用Object Inspector配置Active 属性为true。
C.毗连到客户端。
当监听处事socket控件吸收到一个客户端毗连请求时他们将自动接管这个请求。当你没次收到通知时,OnClientConnetc事件将产生。
D.取得关于毗连的信息
一但你的处事器socket打开了监听毗连,你可以或许利用与你处事器socket控件相关联的处事器windows socket object来取得关于毗连的信息。利用Socket property去会见server windows socket object.windows socket object有一个属机可以或许让你找到关于所有勾当的客户socket毗连这些客户socket是你通过处事器socket控件答允毗连的。利用Handle属性去存取windows通过socket连吸收到的信息。
每个勾当的,毗连到客户应用是通过处事、客户windows socket bject (TServerClientWinSocket)封装的。你可以或许通过server windows socket object的毗连属性来会见所有的这些。这些server client windows socket object有些属性让你可以或许抉择哪些地点和端标语给毗连的两头–客户和处事器socket利用。当你利用windows socket API挪用时,可以利用SocketHandle属性去得到socket毗连利用的handle。你可以或许利用Handle属性去会见windows从socket毗连处得来的信息。AsyncStyles属性抉择windows handle将吸收哪种范例的信息。
E.封锁毗连
当你抉择封锁监听毗连时,挪用Close要领。这将封锁所有打开着的,毗连到客户应用的毗连,打消任何尚未同意的毗连,接着封锁监听毗连以便你的处事socket控件不在接管任何新的毗连。当客户端封锁他们本身独立的毗连到你的server socket的毗连时,你可以在OnClientDisconnect事件中获得讯息。
五、socket事件的应答
#p#分页标题#e#
当利用sockets写应用措施时,大大都事情产生在socket控件的handler事件中.当通过socket毗连开始读或写时,OnRead和OnWrite事件在non-blocking client sockets中产生从而通知sockets.同样的,处事器sockets(blocking or non-blocking)收到OnClientRead和OnClientWrite事件.
当处事器竣事一个毗连时,客户scokets收到一个OnDisconnect事件.当客户端竣事一个毗连时,处事器socket收到一个OnClientDisconnect事件.
别的,客户端Sockets和处事器端socket从毗连中收到一个错误信息时,都将发生有个错误事件.
错误事件:客户sockets和处事器sockets凡是会发生一个OnError事件,当他们从毗连中收到一个错误信息的时候.你可以或许写一个OnError事件处理惩罚去响应这些错误信息.这个OnError事件处理惩罚提供传送关于socket试图做什么的时候这个错误产生的信息,以及错误信息提供的错误代码.你可以在OnError事件处理惩罚中对这个错误作出响应,而且把错误代码改为0,以制止socket发生一个破例.
当开始和完成产生时,socket控件凡是会收到一个事件号(number of events).假如你的应用措施需要改变socket开始操纵的处理惩罚进程或通过毗连开始读或写操纵时,你将写事件handlers去应答这些client events和server events.
A.client events
当一个客户socket打开一个毗连时,以下事件产生:
1.一个OnLookup事件最先产生,它试图去定位server socket.在这里你不能改变Host,Address,Port,Service属性去改变你想定位的处事器.你可以或许利用Socket属性去会见client windows socket object,而且利用它的SocketHandle属性去挪用windows API,以便改变socket的客户属性.譬喻,假如你想在客户应用软件中配置端标语,你必需在server client毗连前做这件事.
2.windows socket配置和初始化事件通知.
3.当找到server socket时一个OnConnecting事件产生.在这事件中,windows Socket object可以操作的是通过socket属性提供关于毗连的另一端的处事socket的一些信息.这是得到实际利用来毗连的端口和IP地点的第一个时机,它大概差异于从监听socket处同意毗连时获得的端口或IP地点.
4.处事器同意毗连请求,客户端socket完成毗连.
5.当一个毗连获得确定后,一个OnConnect事件产生.假如你的socket当即开始通过毗连读或写,就应写一个OnConnect事件Handler去作这件事.
B.处事器端事件(server events)
处事器socket控件通过两中方法毗连:监听毗连和毗连到客户应用.处事器socket收到这两个毗连的所有事件.
监听时事件
当组成监听毗连前,OnListen事件产生.在这个时候你可以或许通过socket属性得到server windows socket object.你可以或许利用它的SocketHandle属性去改变socket,在socket打开监听之前.譬喻,假如你想限定监听处事利用的IP地点,你可以在这个OnListen事件Handler中做.
与客户端毗连的事件
当一个处事器socket同意一个客户毗连请求时,接下来的事件产生:
1.处事器socket发生一个OnGetSocket事件,通过windows socket handle传送给毗连的另一端的socket.假如你想提供本身界说的TServerClientWinSocket of descendant,你可以在OnGetSocket 事件 handler中成立,将被用来替代TServerClientWinSocket.
2.一个OnAccept事件产生,传送新的TServerClientWinSocket工具给事件句柄.这是第一个要点,当你利用TServerClientWinSocket的属性去得到被毗连中处事的那端的客户的信息时.
3.假如处事范例是stThreadBlocking,一个OnGetThread事件产生.假如你想提供本身界说的TServerClientThread子类,你可以在OnGetThread事件句柄中成立一个,它将替代TServerClientThread.
4.假如处事范例是stThreadBlocking,一个ONThreadStart事件产生当这个线程(thread)开始执行时.假如你想执行任何初始化这个线程,或挪用一些windows socket API在这线程开始通过毗连读和写之前,应该利用OnThreadStart事件句柄.
5.当客户端完成一个毗连时,一个OnClientConnect事件产生.假如是non-blocking处事,你大概想开始通过socket毗连在这端举办读或写操纵.
六、通过socket毗连举办读和写
通过socket毗连到其他呆板的原因是想通过这些毗连来读和写信息.什么信息是你要读和写的,可能当你想读和写时是依靠哪些socket毗连的相关处事的.
通过sockets举办读和写可以是异步的,所以在你的网络应用中不需要阻塞其他代码的执行.这是挪用non-blocking connection.你也同样可以通过blocking connection,这时你的下一行代码的执行必需比及读或写操纵完成.
A.Non-blocking毗连,读和写是异步的, 所以在你的网络应用中不需要阻塞其他代码的执行.成立一个Non-blocking毗连:
1.在客户socket中配置ClientType属性为ctNonBlocking.
2.在处事器socket中配置ServerType属性为stNonBlocking.
当毗连是non-blocking时,毗连的另一端诡计读或写时读和写事件将把这个信息通知你的socket.
读和写操纵事件
#p#分页标题#e#
Non-blocking sockets想通过毗连读或写时,它会发生一个读和写操纵事件通知你的socket.在客户端sockets,你可以在OnRead或OnWrite事件句柄中对这些事件做出回响.在处事器端Scokets,可以在OnClientRead或OnClientWrite事件句柄中对这些事件做出回响.与socket毗连相关联的windows socket object在事件句柄的读或写中被看成一个参数.Windows socket object提供一个要领号(number of methods)以答允你通过毗连读或写.
通过socket毗连读,利用ReceiveBuf或ReceiveText要领.在利用ReceiveBuf要领前,利用Receivelength要领去确定在毗连的另一端socket筹备发送的字节数(number of bytes).
通过socket毗连写,利用SendBuf,SendStream,或SendText要领.假如你通过socket发送信息后不在需要socket毗连,你可以利用SendStreamThenDrop要领. SendStreamThenDrop在写完所有的信息后将封锁Socket毗连,它可以或许从stream读信息.假如你利用SendStream或SendStreamThenDrop要领,不要释放Stream object, socket在毗连竣事后会自动释放这个Stream.
留意:SendStreamThenDrop将封锁一个独立的客户毗连处事,而不是监听毗连.
B.Blocking connections
当你利用的毗连是Blocking时,你的Socket必需通过毗连提倡读或写操纵,胜过被动的期待从socket毗连发来的通知. 当你的毗连结尾的读和写操纵产生改变时利用Blocking socket.对付客户端sockets,配置ClientType属性为ctBlocking 以便组成一个blocing connection.按照你的客户端应用想完成什么,你大概想成立一个执行线程去完成读或写.