This error occurs when I'm closing a connection with some client. The error is on this code line in the server:
Received := SocketStrm.Read(Data, SizeOf(Data));
And also, when the smartphone is rebooted (or, for example, when I close the client application), the data of the lost client not is being removed from the ListView in the server application.
Can someone help me fix these 2 errors, please?
Here is the code how I send data:
Client (Android):
 public class MainActivity extends AppCompatActivity {
        private Socket xclientSocket;
            class ClientThread implements Runnable {
                @Override
                public void run() {
                    try {
                        InetAddress serverAddr = InetAddress.getByName("192.168.15.12");
                        xclientSocket = new Socket(serverAddr, 101);
                        new Thread(new CMDThread()).start();
                    } catch (Exception e1) {
                        System.out.println(e1.toString());
                    }
                }
            }
            class CMDThread implements Runnable {
                @Override
                public void run() {
                    try {
                    while(xclientSocket.isConnected()){
                        BufferedReader xreader = new BufferedReader(new InputStreamReader(xclientSocket.getInputStream()));
                        DataOutputStream dOut = new DataOutputStream(xclientSocket.getOutputStream());
                        String xline;
                        if (xreader.ready()) {
                            while ((xline = xreader.readLine()) != null) {
                                System.out.println(xline);
                                if (xline != null && !xline.trim().isEmpty()) {
                                    if (xline.equalsIgnoreCase("info")) {
                                        DataOutputStream dOut = new DataOutputStream(xclientSocket.getOutputStream());
                                        dOut.writeChars("<|data|>" + myDeviceProduct.toUpperCase() + "<|>" + myDeviceModel + "<|>" + myVersion + "<|>" + SIM_OPNAME + "<|>" + SIM_NUMBER + "<<|");
                                        dOut.flush();
                                    }
                                    if (xline.equalsIgnoreCase("disconnect-client")) {
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    System.out.println("Shutting down Socket!!");
                    xclientSocket.close();
                }
            catch (Exception e1) {
                    System.out.println(e1.toString());
                }
            }
            }
        ///////////////////////// USAGE /////////////////////////////
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                new Thread(new ClientThread()).start();
                }
            }
Server (Delphi):
type
  TCMDSock_Thread = class(TServerClientThread)
  private
    function ArrayToString(const a: array of Char): string;
    procedure addClientToListView;
  protected
    procedure ClientExecute; override;
  end;
var
  FMain: TFMain;
  Manufacturer, Model, OsVersion, SIMOpName, SIMNumber: string;
implementation
{$R *.dfm}  
//==============================================================================================================
function TCMDSock_Thread.ArrayToString(const a: array of Char): string;
begin
  if Length(a)>0 then
    SetString(Result, PChar(@a[0]), Length(a))
  else
    Result := '';
end;
procedure TCMDSock_Thread.addClientToListView;
var
  Item: TListItem;
begin
  Item := FMain.ListView1.Items.Add;
  Item.Caption := IntToStr(ClientSocket.Handle);
  Item.SubItems.Add(ClientSocket.RemoteAddress);
  Item.SubItems.Add(ClientSocket.RemoteHost);
  Item.SubItems.Add(Manufacturer +' - '+Model+' - '+OsVersion);
  Item.SubItems.Add(SIMOpName+' - '+SIMNumber);
  Item.Data := ClientSocket.Data;
  FMain.ServerStatus.Panels.Items[1].Text := 'Connected';
end;
procedure TCMDSock_Thread.ClientExecute;
var
  Data: array [0 .. 1023] Of Char;
  SocketStrm: TWinSocketStream;
  ReceivedText: string;
  Received: Integer;
begin
  ClientSocket.SendText('info' + #13#10);
  SocketStrm := TWinSocketStream.Create(ClientSocket, 5000);
  try
    while ClientSocket.Connected do
    begin
      if not SocketStrm.WaitForData(100) then
        Continue;
      FillChar(Data, SizeOf(Data), #0);
      SocketStrm.Read(Data, SizeOf(Data));
      repeat
        try
          Received := SocketStrm.Read(Data, SizeOf(Data));
        except
          Break;
        end;
      until Received = 0;
      ReceivedText := ArrayToString(Data);
      if Pos('<|data|>', RecText) > 0 then
      begin
        Delete(ReceivedText, 1, Pos('<|data|>', ReceivedText) + 7);
        Manufacturer := Copy(ReceivedText, 1, Pos('<|>', ReceivedText) - 1);
        Delete(ReceivedText, 1, Pos('<|>', ReceivedText) + 2);
        Model := Copy(ReceivedText, 1, Pos('<|>', ReceivedText) - 1);
        Delete(ReceivedText, 1, Pos('<|>', ReceivedText) + 2);
        OsVersion := Copy(ReceivedText, 1, Pos('<|>', ReceivedText) - 1);
        Delete(ReceivedText, 1, Pos('<|>', ReceivedText) + 2);
        SIMOpName := Copy(ReceivedText, 1, Pos('<|>', ReceivedText) - 1);
        Delete(ReceivedText, 1, Pos('<|>', ReceivedText) + 2);
        SIMNumber := Copy(ReceivedText, 1, Pos('<<|', ReceivedText) - 1);
        Synchronize(addClientToListView);
      end;
    end;
  finally
    SocketStrm.Free;
  end;
end;
//================================================================================================================
procedure TFMain.ServerSocket1GetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
begin
  SocketThread := TCMDSock_Thread.Create(False, ClientSocket);
end;
procedure TFMain.Button2Click(Sender: TObject); // <= PopupMenu
var
  Index: Integer;
begin
  Index := ListView1.Selected.Index;
  if Index = -1 then
    Exit;
  ServerSocket1.Socket.Connections[Index].SendText('disconnect-client' + #13#10);
  ServerSocket1.Active := False;
end;
procedure TFMain.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  Item: TListItem;
begin
  Item := FMain.ListView1.FindCaption(0, IntToStr(Socket.Handle), False, True, False);
  if Item <> nil then
    Item.Delete;
  FMain.StatusBar1.Panels.Items[1].Text := 'Desconnected';
end;