uses System, System.Net, System.Net.Sockets, System.Threading, crt;

type
  TByteArray = array of byte;

var
  client: TCPClient;
  s_str: NetworkStream;
  s_raw: TByteArray;
  s_ip, cl_str, cl_stro, name: string;
  s_port, length: integer;
  thr_s, thr_r: Thread;

procedure send;
begin
  while true do
  begin
    readln(cl_str);
    s_str.Write(System.Text.Encoding.Default.GetBytes(cl_str), 0, cl_str.Length);
  end;
end;

procedure read;
begin
  while true do
  begin
    length := s_str.Read(s_raw, 0, s_raw.Length);
    cl_stro := System.Text.Encoding.Default.GetString(s_raw, 0, length);
    writeln(cl_stro);
  end;
end;

begin
  s_raw := TByteArray(System.Array.CreateInstance(typeof(byte), 1024));
  try
    textcolor(14);
    write('Введите IP: ');
    readln(s_ip);
    write('Введите порт: ');
    readln(s_port);
  except
    textcolor(4);
    writeln('Какая-то ошибка... Закрываем приложение.');
    sleep(2500);
    exit;
  end;
  textcolor(2);
  try
    client := TCPClient.Create;
    client.Connect(ipAddress.Parse(s_ip), s_port);
    if client.Connected = true then
    begin
      write('Введите имя: '); readln(name);
      s_str := client.GetStream;
      s_str.Write(System.Text.Encoding.Default.GetBytes(name), 0, name.Length);
      writeln('Подключено к ', s_ip);
      length := s_str.Read(s_raw, 0, s_raw.Length);
      cl_str := System.Text.Encoding.Default.GetString(s_raw, 0, length);
      writeln(cl_str);
      thr_s := new Thread(send);
      thr_s.Start;
      thr_r := new Thread(read);
      thr_r.Start;
    end;
  except
    if client.Connected = false then
    begin
      textcolor(4);
      writeln('Подключение не удалось. Выход...');
      sleep(2500);
      exit;
    end;
  end;
end.