使用TServerSocket构件提供多线程服务

最近要写一个socket的多线程的服务,刚刚好从网上找到这篇文章,觉得有用,保存下来
      {
使用TServerSocket构件提供多线程服务
www.mynetlife.com  2002-12-29  网迷教程


使用TServerSocket构件提供多线程服务
对于一个socket来说,很容易提供一个侦听消息的多线程服务。Delphi自身也提供了这样的构件:TServerSocket。
不过这里边也需要一点小技巧。
为此,我们要做以下几件事:
-将TServerSocket加入main窗体中
-设置Servertype属性为stThreadBlocking
-生成一个新单元(如下)来包含服务线程
将下面的代码赋给OnGetThread事件响应函数
   }

procedure TfrmMain.fSocketGetThread(Sender: TObject;  ClientSocket: TServerClientWinSocket;  var SocketThread: TServerClientThread);

begin

// 在每次一个新连接建立的时候为它生成一个新的TServerThread对象。

  SocketThread := TServerThread.Create(FALSE, ClientSocket);

end;

       {下面是我自己生成的TServerThread对象代码.该对象从TServerClinetThread继承而来,包含从socket读写数据的代码。}
unit serverthread;

interface

uses

  windows, scktcomp, SysUtils, Classes, Forms;

type
  EServerThread = class(Exception);
// TServerThread服务线程类是TServerClientThread的派生类
  TServerThread = class(TServerClientThread)

  private
    fSocketStream: TWinSocketStream;

  public
    procedure ClientExecute; override;

// ClientExecute过程将覆盖TServerClientThread.ClientExecute过程
// 并包含实际执行的代码于线程开始时。
  end;

implementation

procedure TServerThread.ClientExecute;
begin
  inherited FreeOnTerminate := TRUE;
  try
    fSocketStream := TWinSocketStream.Create(ClientSocket, 100000);
   // 设置100000毫秒的充许超时.
    try
      while (not Terminated) and (ClientSocket.Connected) do
      try
      // 在此处加入你对输入、读、写的等待
      // 下面的示范你可以拿来照搬在此

      except on e: exception do begin
         // 一旦错误发生就关闭并退出
          ClientSocket.Close;
          Terminate;
        end;
      end;
    finally
      fSocketStream.Free;
    end;
  except on e: exception do  begin
     // 一旦错误发生就关闭并退出
      ClientSocket.Close;
      Terminate;
    end;
  end;
end;

      {一旦连接建立,线程需要等待数据到来.你可以使用下面的代码来等待数据:}
if (not Terminated) and (not fSocketStream.WaitForData(1000000)) then
begin
// 超时处理
end;

// 数据到达!
    {为了读取数据,我们需要建立一个数据缓冲区存取到达的数据,可以使用PByteArray或一个char型的数组.
在此例中我设置了一个名为fRequest的char型数组缓冲。此外我将其设为定长,其大小由REQUESTSIZE常量决定.}
var
  ac, readlen: integer;
begin
  FillChar(fRequest, REQUESTSIZE, 0);
  ac := 0;
  repeat
    readlen := fSocketStream.Read(fRequest[ac],1024);
    // 每次读取1024 bytes直到缓冲区满
    ac := ac + readlen;
  until (readlen = 0) or (ac = REQUESTSIZE);
end;
{
如果说readlen是 0 的话,说明我未收到任何数据.读函数的超时从TWinSocketStream.Create()执行后开始.如果说你不知道预期的数据量,你最好将超时设置得尽量小些.在大多数情况下 30 秒是上限.
当发送一个应答时,你应该很清楚客户端的行为.许多客户端仅仅等待一个应答包,一些则等待许多包.
在本例中,我只设置了一个客户端并只等待一个包,所以我们需要一次就将数据包发送出去。

fSocketStream.WriteBuffer( fRep, fReplySize );
fRep是应答缓冲区,fReplySize则是缓冲区大小.  }

转载于:https://www.cnblogs.com/liukun966123/archive/2004/08/17/34188.html

Delphi中的TServersocket控件用于在应用程序中创建TCP/IP服务器。它允许应用程序与远程客户端建立连接,并通过这些连接交换数据。 TServersocket控件是通过监听特定的服务端口来等待客户端的连接请求。当有客户端请求连接时,TServersocket会自动创建一个新的线程来处理该连接,以避免主线程阻塞。 在Delphi中,我们可以通过编写OnClientConnect事件处理程序来添加自定义代码,以便在客户端连接时执行特定的操作。例如,我们可以在该事件中显示连接客户端的IP地址或发送“欢迎”消息。 TServersocket提供了OnClientRead和OnClientWrite事件处理程序,可以在每次读取和写入数据时执行相应的操作。例如,在OnClientRead事件中,我们可以处理接收到的数据,并根据情况发送响应给客户端。 此外,TServersocket还支持多个并发连接。每个连接都会自动分配一个新的线程,以便并行处理多个客户端。这使得我们可以同时与多个客户端进行通信,而无需手动管理线程。 线程的管理是由TServersocket控件自动处理的,因此我们无需过于关注线程的创建和销毁。然而,我们应该确保在线程中正确地处理异常和释放资源,以避免潜在的内存泄漏或应用程序崩溃。 总的来说,Delphi的TServersocket控件提供了一个简单而强大的方式来创建TCP/IP服务器。它使用线程来处理客户端连接,使我们能够高效地管理并发连接,并实现自定义操作,以满足特定的应用程序需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值