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