Delphi5是Tserversocket和Tclientsocket的一个简单示例

Delphi5是Tserversocket和Tclientsocket的一个简单示例,delphi,Delphi,如果可能,请在DELPHI 5中提供一个示例 假设我们有以下代码:一个简单的tclientsocket与一个tserver套接字通信。 如果tclientsocket的请求是在tserversocket1onReadClient事件的数据处理之后发出的,则一切正常。 但是,在处理过程中,我从socketclient1收到一个新的请求,但我还没有完成处理,如何绕过这个问题呢 我必须在ServerType:stThreadBlocking中实现它吗 我必须创建一个线程来完成这个过程吗 这是一种更好的

如果可能,请在DELPHI 5中提供一个示例

假设我们有以下代码:一个简单的tclientsocket与一个tserver套接字通信。 如果tclientsocket的请求是在tserversocket1onReadClient事件的数据处理之后发出的,则一切正常。 但是,在处理过程中,我从socketclient1收到一个新的请求,但我还没有完成处理,如何绕过这个问题呢

  • 我必须在ServerType:stThreadBlocking中实现它吗
  • 我必须创建一个线程来完成这个过程吗
  • 这是一种更好的方法吗
  • 我的tclientsocket字符串消息将不超过255个字符

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ScktComp;
    
    type
      TForm1 = class(TForm)
        ClientSocket1: TClientSocket;
        Button1: TButton;
        ServerSocket1: TServerSocket;
        procedure Button1Click(Sender: TObject);
        procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer);
        procedure ServerSocket1ClientError(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);
        procedure ServerSocket1ClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
      private
      public
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.DFM}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    with Serversocket1 do
    begin
    Active:=false;
    ServerType:=stNonBlocking;
    port:=5052;
    Active:=true;
    end;
    
    with ClientSocket1 do
    begin
    active:=false;
    port:=5052;
    Address:='127.0.0.1';
    host:='127.0.0.1';
    active:=true;
    end;
    end;
    
    procedure TForm1.ClientSocket1Error(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
    errorcode:=0;
    end;
    
    procedure TForm1.ServerSocket1ClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
    errorcode:=0;
    end;
    
    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);
    var mydata:String;
    begin
    mydata:=socket.ReceiveText;
    ///Proceccing my data now
    //Line 1
    //Line 2
    //Line 3
    //Line 4  <---- ie. when i am proccessing line 4 a new Request from clientsocket1 arrives
    //Line 5
    end;
    
    end.
    
    单元1;
    接口
    使用
    窗口、消息、系统工具、类、图形、控件、窗体、对话框、,
    StdCtrls,ScktComp;
    类型
    TForm1=类(TForm)
    ClientSocket1:TClientSocket;
    按钮1:t按钮;
    ServerSocket1:TServerSocket;
    程序按钮1点击(发送方:ToObject);
    过程ClientSocket1Error(发送方:ToObject;套接字:TCustomWinSocket;ErrorEvent:TerroEvent;var错误代码:Integer);
    过程ServerSocket1ClientError(发送方:ToObject;套接字:TCustomWinSocket;ErrorEvent:TerroEvent;var错误代码:Integer);
    过程ServerSocket1Client(发送方:ToObject;
    套接字:TCustomWinSocket);
    私有的
    公众的
    结束;
    变量
    表1:TForm1;
    实施
    {$R*.DFM}
    程序TForm1.按钮1单击(发送方:TObject);
    开始
    用Serversocket1做什么
    开始
    活动:=假;
    服务器类型:=stNonBlocking;
    端口:=5052;
    活动:=真;
    结束;
    用ClientSocket1做什么
    开始
    活动:=假;
    端口:=5052;
    地址:='127.0.0.1';
    主机:='127.0.0.1';
    活动:=真;
    结束;
    结束;
    程序TForm1.ClientSocket1错误(发送方:ToObject;
    套接字:TCustomWinSocket;ErrorEvent:TerroEvent;
    var错误代码:整数);
    开始
    错误代码:=0;
    结束;
    过程TForm1.ServerSocket1ClientError(发送方:ToObject;
    套接字:TCustomWinSocket;ErrorEvent:TerroEvent;
    var错误代码:整数);
    开始
    错误代码:=0;
    结束;
    过程TForm1.ServerSocket1Client(发送方:ToObject;套接字:TCustomWinSocket);
    var-mydata:String;
    开始
    mydata:=socket.ReceiveText;
    ///正在处理我的数据
    //第1行
    //第2行
    //第3行
    
    //第4行您描述的场景不可能发生。执行
    ServerSocket1ClientRead
    事件处理程序时,不会以重入方式调用它。除非您要调用
    应用程序.ProcessMessages
    。所以,不要那样做

    因此,如果我有许多Tclientsockets试图同时发送数据,将会发生什么?事件处理程序将被多次调用。但不是以重新进入的方式。因此调用事件处理程序,完成执行,返回。然后它会再次被调用。一次又一次。这是计算的基本模型。单线程执行不会被中断。创建xxx客户端并在每次向服务器发送文本后设置睡眠(10)一切正常。如果删除睡眠(10),我会得到40-50个响应。这很难理解。我们看不到你的代码。不过,我似乎很清楚,无论您的问题是什么,它都不是此事件处理程序的重入调用。我为x=0到255创建了一个循环,在循环内部我创建了255次clientsocket和onconnect消息,然后我发送了一些文本。如果我在循环内部添加了sleep(10)命令,则一切正常,我从线程收到256个响应。