ClientSocket 和ServerSocket 几个重要的属性: 1.client和server都有port属性,须要一致才能互相通讯 2.client有Address属性,使用时填写对方(server)的IP地址 几个重要的事件: client: OnRead事件,当client受到冲击消息时在OnRead事件中能够得到server发送过来消息。 Server: OnClientRead事件,与上述client的做用相同 发送信息: clien使用SocketClient1.Socket.SendBuf(char类型的数组,信息长度); server使用SocketServer1.Socket.Connection[0].SendBuf(char类型的数组,信息长度); 接收信息 clien使用SocketClient1.Socket.ReceiveBuf(char类型的数组,信息度); server使用SocketServer1.Socket.Connection[0].ReceiveBuf(char类型的数组,信息长度);
编程 使用sockets Socket 控件让你创建一个利用TCP/IP和有关的协议与其余系统进行通讯的应用。使用Sockets,你可以读和写经过它链接的其余机器,而不用担忧实际的网络软件的相关细节。Sockets提供基于TCP/IP协议的链接。除此之外还能很好的工做,在其余相关的协议。 Delphi 提供你写网络服务器或客户应用程序去读和写其余的系统。一个服务或客户程序一般专一于一个单一的服务如超文本传送协议(HTTP)或文件传输协议(FTP)。使用server sockets,一个应用程序能够提供这些服务中的一个去链接一个但愿使用服务的客户程序。Client sockets容许一个应用使用这些服务中的一个去链接提供这个服务的服务应用。 使用sockets去写应用程序,你必须理解下面这些知识: 1、服务工具 当你须要写网络服务或客户应用时,Sockets提供一种接合。对于许多服务,象HTTP 或 FTP,第三方服务商提供这些服务已经至关有效。有些甚至随着操做系统捆绑而来,以便不用你本身写。然而,当你想更多的控制服务的实现,如想让你的应用程序与网络通讯更加紧密,或当没有一个服务能提供你特殊须要的服务时,你可能想创建你本身的服务或客户应用。例如,工做在分布式data sets时,你可能想为数据库写一层与其余系统通讯的应用。想使用Sockets实现一个服务,你必须理解: 1.服务协议 在你写一个网络服务或客户程序前,你必须明白你的应用将提供或使用什么服务。你的网络应用必须支持许多服务的标准协议。若是你为标准的服务例如HTTP,FTP写网络应用,你必须先理解与其余系统通讯所使用的协议。特殊服务细节你必须看提供的或使用的文档。 若是你的应用程序提供一个新的服务与其余系统通讯,第一步是为这个服务的服务端和客户端设计通讯协议。什么信息将发送?如何整理这些信息?如何对这些信息进行编码? 应用程序通讯 常常的,你的网络服务端或客户端应用程序要提供一层在网络软件和一个应用之间使用的服务。例如,一个HTTP服务站点在INternet与一个Web 服务应用之间为HTTP请求信息提供内容和应答。 在你的网络应用(或客户应用)和网络软件之间Sockets 提供一个接口。你必须提供一个接口,在你的应用程序与应用间使用。你能够拷贝第三方服务商提供的标准API(例如ISAPI),或你能够设计和发布你本身的API. 2.理解服务和端口 许多标准服务都有关联的、指定的端口号。当执行服务时,你能够为服务考虑一个端口号。若是你实现一个标准服务,Windows socket objects 提供一些方法让你为服务寻找端口号。若是提供一个新的服务,在基于Windows 95 或 NT机器上,你可以在文件Services中为你的服务指定一个相关联的端口号。设置Services文件的更多信息请看微软的Windows Sockets文档。 2、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)链接是根本不一样的,它只有一个单一的末端。
windows 3、sockets描述 Sockets让你的网络应用软件经过网络与其余系统进行通讯。在网络链接中每一个socket能够当作一个终端点。它有一个指定的地址。 *这个系统正在运行 *它理解的接口类型 *用来链接的端口 一个完整的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的端口号,这样他们就能找到服务器应用程序。经常的,这个端口号是经过命名想链接的服务来间接指定的。 4、使用socket控件 Delphi提供两个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。 若是你不知道主机名,或者你关心找到服务器的速度,你能够指定服务器系统的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控件ServerSocket 到你的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事件中获得讯息。 5、socket事件的应答 当使用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链接在这端进行读或写操做. 6、经过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. 读和写操做事件 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.根据你的客户端应用想完成什么,你可能想创建一个执行线程去完成读或写操做,以便你的应用可以继续执行其余的线程,当它在等待经过链接读或写操做的完成. 对于服务器sockets,设置ServerType属性为stThreadBlocking 以便构成一个blocking connection.由于blocking connections在等待经过链接读或写信息完成时挂起了其余代码的执行,服务器socket控件一般产生一个新的执行线程给每个客户链接,当ServerType设置为stThreadBlocking时.许多使用Blocking链接的应用都写使用线程(using threads.甚至若是你不使用线程,你可能也想使用 TWinSocketStream 去读和写. 1)using threads 当使用一个blocking connection进行读或写操做时,客户sockets不会自动产生一个新线程.若是你的客户应用程序没有什么事作,直到读或写信息完成,那么这正是你想要的.若是你的应用包括了一个用户界面,它还须要响应用户的操做,那么,你可能想产生一个独立的线程去读写.当服务器sockets造成一个blocking链接时,他们经常产生独立的线程给每个客户链接,因此没有客户须要等待直到其余客户完成经过链接读或写操做.在默认状况下,服务器sockets使用TServerClientThread对象去实现为每一个链接执行不一样的线程. TServerClientThread对象模拟发生在non-blocking链接中的OnClientRead和OnClientWrite事件.但是,这些事件发生在监听socket上时,不是本地线程(thread-local).若是客户请求频繁,你将想创建你本身的TServerClientThread子类去提供一个安全线程(Thread-Safe)去完成读和写操做. 当写客户线程或写服务器线程时,你可以使用TwinSocketStream去作实际的读写操做. A)写客户端线程 为客户端链接写一个线程,定义一个新线程对象,使用新线程对象对话框.你的新线程对象Execute方法的句柄的经过线程链接进行读写操做的细节,能够创建一个TWinSocketStream对象,而后使用它来读或写. 使用你本身的线程,在OnConnect事件句柄中创建它.关于创建和运行线程的更多信息,请看Executing thread objects. B)写服务器线程 服务器链接线程由TServerClientThread派生.由于这个,不能使用新线程对象对话框替代的. 注意你将用重载ClientExcute方法替代Execute方法.执行ClientExecute方法必须为客户端链接写一个一样的Execute方法线程.然而,当你从控件栏上放一个客户socket控件到你的应用上时来替代这个方法时.监听服务socket赞成一个链接时,服务客户线程必须使用TServerClientWinSocket对象来创建.这能够利用共公共的CientSocket属性.另外,你可以使用HandleException这个protected性的方法,赛过 你本身写你的thread-safe例外操做. 警告:Server sockets会缓存他们使用到的线程.确信ClientExecute方法执行一些必要的初始化操做,以便它们在最后执行时不致于产生不利的结果. 当你使用你的线程时,在OnGetThread事件句柄中创建它.当创建线程,设置CreateSuspended参数为false. C.使用TwinSocketStream 当为一个blocking链接实现一个线程时,你必须肯定在链接的另外一端的socket是准备写仍是读.Blocking链接不会通知socket当它准备好写或读操做的时候.想看看链接是否准备好,使用TWinSocketStream对象.TWinSocketStream提供一个方法去帮助调整读或写操做时间的选择.调用WaitForData方法去等待,直到socket另外一端的准备好写操做.当读写操做使用TWinSocketStream时,若是读或写操做在指定的时间期限内未能完成,Stream将发生超时.这个超时被看成一个结果,socket应用不会暂停,而是不断的经过一个dropped connection试图读或写. 异步 |