предоставьте пример в ДЕЛФИ 5, если это возможно
Допустим, у нас есть следующий код. Простой tclientsocket взаимодействует с сокетом tserver. Все работает нормально, если запросы от tclientsocket приходят после обработки данных о событии tserversocket1onReadClient. Но как я могу обойти проблему, когда в середине процесса я получаю новый запрос от socketclient1, а мой процесс еще не завершен?
Мои строковые сообщения 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.
Сценарий, который вы описываете, не может произойти. Когда обработчик событий ServerSocket1ClientRead
выполняется, он не будет вызываться повторно в режиме повторного входа. Ну, если только вы не позвонили в Application.ProcessMessages
. Так что не делай этого!
Обработчик события будет вызываться много раз. Но не в моде для повторного входа. Итак, обработчик события вызывается, завершает выполнение, возвращается. Затем его снова вызывают. И снова. Это основная модель вычислений. Ни один поток выполнения не прерывается.
создание xxx клиентов и установка сна (10) после каждого sendtext на сервер, все работает нормально. Если я удалю сон (10), я верну 40-50 ответов.
Это сложно понять. Мы не видим ваш код. Мне кажется очевидным, что, какова бы ни была ваша проблема, это не повторные вызовы этого обработчика событий.
я создаю цикл для x = от 0 до 255, и внутри цикла я 255 раз создаю клиентский сокет и сообщение onconnect, я отправляю некоторый текст. если я добавляю внутри цикла команду sleep (10), все работает нормально, и я получаю обратно 256 ответов из потока .
но если я уберу сон (10), то получу от 40 до 50 случайных ответов. Это то, что я пытался сказать. Все в порядке.
Один TServerSocket
может обрабатывать сообщения от многих TClientSocket
. Он помещает сообщения в очередь и обрабатывает их в порядке поступления.
Итак, если у меня много Tclientsockets, пытающихся отправить данные в одно и то же время, что произойдет?