Не удается отправить текст (строку) из ttcpserver в ttcpclientserver - PullRequest
3 голосов
/ 06 июля 2010

У меня есть 2 формы, одна для сервера, другая для клиента. После удаления ttcpserver в форме сервера и установки его свойства localhost на 127.0.0.1 и свойства localport на 55555 и свойства Active на true я написал обработчик события onclick button1 (sendtextbutton):

procedure TForm2.Button1Click(Sender: TObject);
begin
      TcpServer1.Sendln('message');
end;

Затем в форме клиента я отбросил 1 кнопку ttcpclient 1 label 2, установил свойство удаленного хоста клиента на 127.0.0.1 и 55555 для удаленного порта, написал обработчик события для кнопки connect (button1):

procedure TForm2.Button1Click(Sender: TObject);
begin
try
TcpClient1.Active := true;
except
showmessage('error');

end;
end;

Написал событие onconnect для ttcpclient:

procedure TForm2.TcpClient1Connect(Sender: TObject);
begin
    Label1.Caption := 'connected!';
end;

и, наконец, обработчик события onrecieve для ttcpclient:

procedure TForm2.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin
    Label1.caption := TcpClient1.Receiveln();
end;

Предполагалось, что заголовок моей клиентской программы изменится на «сообщение» (после того, как я подключусь и нажму кнопку на форме моего сервера), но это все-таки произойдет. Я делаю это неправильно? Если да, то как это сделать? Я пытаюсь отправить текстовое сообщение с сервера на клиент (да, обратное соединение!)

Ответы [ 2 ]

2 голосов
/ 06 июля 2010

TTcpServer не хранит список подключенных соединений, которые затрудняют сообщения в стиле широковещания.

Я бы порекомендовал перейти на TidTcpServer и TidTcpClient. Компонент TidTcpServer имеет свойство Context, которое можно циклически пересылать для рассылки сообщений клиентам, аналогично тому, что вы, похоже, хотите сделать.

Вот несколько ссылок на примеры использования TidTcpServer и TIdTcpClient:

1 голос
/ 14 июля 2012

Код вашего сервера не работает, потому что TTcpServer.SendLn() не отправляет данные в конечную точку клиента подключенного сокета. Вот почему клиент никогда не видит данные - они отправляются в подвешенном состоянии.

Если для свойства TTcpServer.BlockMode установлено значение bmThreadBlocking (что по умолчанию), или если для TTcpServer.BlockMode задано что-либо еще, и вы вручную вызываете перегруженный TTcpServer.Accept() метод без параметров, то единственным место, где у вас есть доступ к конечной точке клиента, находится внутри события TTcpServer.OnAccept. В этих условиях при выходе из этого обработчика сервер отключает клиента, поэтому любая работа, которую сервер хочет выполнить с клиентом, должна выполняться из этого события.

Если это не соответствует вашим потребностям, вам придется установить для свойства TTcpServer.BlockMode значение bmBlocking или bmNonBlocking, а затем вручную вызвать перегруженный метод TTcpServer.Accept(), который возвращает объект TCustomIpClient. После того, как событие TTcpServer.OnAccept было запущено и завершено, вы получите право собственности на этот объект и получите полный контроль над его временем жизни, а затем сможете получить к нему доступ в любое время и в любое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...