Delphi 5 - простой пример для Tserversocket и Tclientsocket

предоставьте пример в ДЕЛФИ 5, если это возможно

Допустим, у нас есть следующий код. Простой tclientsocket взаимодействует с сокетом tserver. Все работает нормально, если запросы от tclientsocket приходят после обработки данных о событии tserversocket1onReadClient. Но как я могу обойти проблему, когда в середине процесса я получаю новый запрос от socketclient1, а мой процесс еще не завершен?

  1. мне нужно реализовать это в ServerType: stThreadBlocking
  2. Должен ли я создать тему, чтобы выполнить процесс?
  3. это лучший способ сделать это просто.

Мои строковые сообщения 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.
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 330
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сценарий, который вы описываете, не может произойти. Когда обработчик событий ServerSocket1ClientRead выполняется, он не будет вызываться повторно в режиме повторного входа. Ну, если только вы не позвонили в Application.ProcessMessages. Так что не делай этого!

Итак, если у меня много Tclientsockets, пытающихся отправить данные в одно и то же время, что произойдет?

icinema gr 07.09.2018 14:00

Обработчик события будет вызываться много раз. Но не в моде для повторного входа. Итак, обработчик события вызывается, завершает выполнение, возвращается. Затем его снова вызывают. И снова. Это основная модель вычислений. Ни один поток выполнения не прерывается.

David Heffernan 07.09.2018 14:04

создание xxx клиентов и установка сна (10) после каждого sendtext на сервер, все работает нормально. Если я удалю сон (10), я верну 40-50 ответов.

icinema gr 07.09.2018 14:27

Это сложно понять. Мы не видим ваш код. Мне кажется очевидным, что, какова бы ни была ваша проблема, это не повторные вызовы этого обработчика событий.

David Heffernan 07.09.2018 14:59

я создаю цикл для x = от 0 до 255, и внутри цикла я 255 раз создаю клиентский сокет и сообщение onconnect, я отправляю некоторый текст. если я добавляю внутри цикла команду sleep (10), все работает нормально, и я получаю обратно 256 ответов из потока .

icinema gr 07.09.2018 16:55

но если я уберу сон (10), то получу от 40 до 50 случайных ответов. Это то, что я пытался сказать. Все в порядке.

icinema gr 07.09.2018 16:57

Один TServerSocket может обрабатывать сообщения от многих TClientSocket. Он помещает сообщения в очередь и обрабатывает их в порядке поступления.

User007 09.09.2018 00:52

Другие вопросы по теме