delphi tserversocket игнорирует 1-е сообщение

#delphi #sockets #tcp

#delphi #сокеты #tcp

Вопрос:

пожалуйста, сообщите, почему это происходит. в простом примере серверного приложения у меня есть следующий код:

 procedure TForm13.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var str : string;
begin
  str := socket.ReceiveText;
  showmessage(str);
end;
  

и на стороне клиента у меня есть

 clientsocket1.Open;
clientsocket1.Socket.SendText(txtMSG.Text);
  

ничего особенного.
странно то, что когда я отправляю сообщение на сервер в первый раз, оно игнорируется. каждый раз после этого он отлично работает. событие ClientRead вообще не запускается при 1-м сообщении

что я могу изменить на сервере, чтобы он принял 1-е сообщение. У меня нет контроля над клиентской стороной, поскольку третья сторона отправляет мне сообщения, но я всегда пропускаю 1-е сообщение.

Спасибо!

Комментарии:

1. Я рекомендую перейти на Synapse или Internet Direct (Indy), старые компоненты сокетов устарели со времен Delphi 6

2. @mjn: они устарели в D2009, а не в D6. И только потому, что они устарели, не означает, что их нельзя использовать или они все еще бесполезны.

Ответ №1:

Если вы используете TClientSocket неблокирующий режим (который используется по умолчанию), вы не сможете отправлять данные сразу после Open() возврата, так как соединение еще не готово. Сначала нужно дождаться запуска OnConnect события, например:

 Procedure TForm1.StartConnectingToServer;
Begin
  ClientSocket1.Open;
End;

Procedure TForm1.ClientSocket1Connect(Socket: TCustomWinSocket);
Begin
  Socket.SendText(txtMSG.Text);
End;
  

Комментарии:

1. это многое объясняет! к сожалению, в примере реального мира у меня нет контроля над клиентской частью, поскольку это сторонняя система, написанная GE, и я не вижу, чтобы они вносили изменения в этот код для меня в ближайшее время

2. Вам не нужно беспокоиться об этом. Ваш серверный код в порядке (хотя в реальных ситуациях ReceiveText() он редко бывает полезен, вы будете использовать ReceiveBuf() его намного чаще). Ваша проблема возникла из-за ошибки в вашем тестовом клиенте, пытающемся отправить данные в неподходящее время. Люди, пишущие свои собственные клиенты, будут решать ту же проблему по-своему. Это не ваша ответственность.