Server with TBlockSocket lazarus / 38-Networking and Web Programming ---------------------------------------------------------------------- michoux · 2021-05-06 12:28 Hello, I have found some simple code in forum to start a simple server Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i procedure TForm1.Button3Click(Sender: TObject);begin   listenersocket1:=TBlockSocket.Create;  listenersocket1.CreateSocket;                listenersocket1.Bind('127.0.0.1'7000);    listenersocket1.Listen;                           repeat                                             Application.ProcessMessages;                     if listenersocket1.CanRead(10) then begin             connection1:=TBlockSocket.Create;                  connection1.Socket:=listenersocket1.Accept;          connected1:=true;           end;  until false;end;                                              All ok, now I have problems because I want to connect 2 clients to this server, which is impossible Is there any simple example with threads? I am not really familiar with threads in lazarus .... I found a workaround to create 2 servers each client would connect to own server, if some message received on server A I can pass it to server B with  connection.SendString(message+CR+LF);                      But somehow if both servers are working and client disconnects it can not get back any more to server. Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i procedure TForm1.Button3Click(Sender: TObject);begin   listenersocket1:=TBlockSocket.Create;  listenersocket1.CreateSocket;                listenersocket1.Bind('127.0.0.1',7000);    listenersocket1.Listen;                           repeat                                             Application.ProcessMessages;                     if listenersocket1.CanRead(10) then begin             connection1:=TBlockSocket.Create;                  connection1.Socket:=listenersocket1.Accept;          connected1:=true;         end;  until false;end;                                          procedure TForm1.Button4Click(Sender: TObject);begin   listenersocket:=TBlockSocket.Create;  listenersocket.CreateSocket;                listenersocket.Bind('127.0.0.1',7001);    listenersocket.Listen;                           repeat                                             Application.ProcessMessages;                     if listenersocket.CanRead(10) then begin             connection:=TBlockSocket.Create;                  connection.Socket:=listenersocket.Accept;          connected:=true;    end;  until false;end;                                          procedure TForm1.Timer1Timer(Sender: TObject); begin   Application.ProcessMessages;               if connected=true then begin      commessage:=connection.RecvString(10);      if mmessage<>'' then  begin      connection1.SendString(mmessage+CR+LF);       end;  end;end; ---------------------------------------------------------------------- paweld · 2021-05-06 13:13 nxPascal ( https://github.com/Zaflis/nxpascal ) - demo: https://github.com/Zaflis/nxpascal/tree/master/demos/fpc/networkTest or demo shared by @GetMem: https://forum.lazarus.freepascal.org/index. php/topic,48677.msg350793.html#msg350793 ---------------------------------------------------------------------- michoux · 2021-05-06 13:28 nxPascal  is nice, but I can not connect to it from custom client, allways get timeout <#1 Error(10060): Connection timed out> <#1: Socket closed> I did a simple test with telnet to pport ---------------------------------------------------------------------- paweld · 2021-05-06 14:16 clear Mask: Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i server.Mask := ''; ---------------------------------------------------------------------- michoux · 2021-05-06 14:55 Hmm Still the same <#2: Opened new socket> <#2 Error(10060): Connection timed out> <#2: Socket closed> ---------------------------------------------------------------------- Warfley · 2021-05-06 15:30 I don't know much about TBlockSocket, but if all you want is a simple TCP server, the TInetServer from the ssockets unit (part of the FCL shipped with the FPC) makes this really easy: Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i program Project1; {$mode objfpc}{$H+} uses  Classes,  ssockets,  Generics.Collections; type   { TClientHandlerThread }   TClientHandlerThread = class(TThread)  private    FSocket: TSocketStream;  public    constructor Create(ASocket: TSocketStream);    procedure Execute; override;  end;  THandlerList = specialize TObjectList;   { TMyServer }   TMyServer = class(TInetServer)  private    FClients: THandlerList;    procedure ClientConnected(Sender: TObject; Data: TSocketStream);  public    constructor Create(const aHost: string; const APort: word;      AHAndler: TSocketHandler = nil);    destructor Destroy; override;    procedure WaitForClients(Terminate: Boolean);  end;   { TClientHandlerThread }   constructor TClientHandlerThread.Create(ASocket: TSocketStream);  begin    FSocket := ASocket;    inherited Create(False);  end;   procedure TClientHandlerThread.Execute;  var    c: Char;  begin    // communicate with client via FSocket    while not Terminated do    begin      c := chr(FSocket.ReadByte);      Write(c);   end;  end;   { TMyServer } procedure TMyServer.ClientConnected(Sender: TObject; Data: TSocketStream);var  ClientThread: TClientHandlerThread;begin  ClientThread := TClientHandlerThread.Create(Data);  FClients.Add(ClientThread);end;   constructor TMyServer.Create(const aHost: string; const APort: word;    AHAndler: TSocketHandler);  begin    inherited Create(aHost, APort, AHAndler);    FClients := THandlerList.Create;    OnConnect:=@ClientConnected;  end;   destructor TMyServer.Destroy;  begin    WaitForClients(True);    FClients.Free;    inherited Destroy;  end;     procedure TMyServer.WaitForClients(Terminate: Boolean);  var    Client: TClientHandlerThread;  begin    for Client in FClients do    begin    if Terminate then        Client.Terminate;      Client.WaitFor;    end;  end; var  server: TMyServer; begin  try    server := TMyServer.Create('0.0.0.0', 8090);    server.StartAccepting;  finally    server.Free;  end;end. ---------------------------------------------------------------------- michoux · 2021-05-06 19:26 Thanks, I found perfect example in lnet package.