Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > помогите с TTcpServer


Автор: lubja 26.8.2008, 12:08
пишу простой чат, типа сервер-клиент. клиентом у меня является регистратор. работает это так: регистратор отсылает сообщение серверу, тот отсылает ему что-то, регистратор, получив ответ, тут же отвечает, что "все нормуль, получил". будем это называть сессией. вроде все работает, но! проблема в том, что может происходить только одна сессия! если регистратор пытается тут же отправить еще одно сообщение серверу, то оно уже не доходит до него (смотрела по отладчику: в последующих сессиях на сервере не срабатывает OnAccept).
вот код этой процедуры (может я что-то не так делаю...  smile smile  ):

procedure TFrmServer.TcpServerAccept(Sender: TObject; ClientSocket: TCustomIpClient);
var msg, com: string;
begin
  msg := ClientSocket.Receiveln();  //строка приходит в виде 'SEND|сообщение' либо 'SUCCESS|сообщение'
  while length(msg) > 0 do
    begin
      //функция Command разбивает сообшение на команду (com) и само сообщение (msg)
      com := Command(msg, True);
      msg := Command(msg, False);
      MsgLog.Lines.Add(msg);
      //команда SEND - что регистратор первый раз отсылает сообщение
      if com = 'SEND' then
        begin
          newMsg := FindUser(msg);  //сервер находит в базе сообщение, которое нужно отправить регистратору
          ClientSocket.Sendln(newMsg);         //  Отправить ее обратно
          msg := ClientSocket.Receiveln(); //  Получить очередную строку
        end;
      //команда SUCCESS - уведомляет, что регистратор получил ответ от сервера
      if com = 'SUCCESS' then
        begin
          ChangeUser(msg);
          msg := ''; com := '';  //я обнуляю сообщение и команду, чтобы больше не проводились никакие действия
        end;
    end;
  ClientSocket.Disconnect;  //даже если я убираю эту строчку, все равно та же фигня...
end;

помогите кто, чем может! плиз!!!  smile 

Автор: SneG0K 26.8.2008, 12:26
Ну как бы не TTcpServer а просто TcpServer. Потом еще как бы надо использовать кнопочку код... 
Теперь по сути, вроде в коде все в порядке... Выложи код клиента... 

Цитата(lubja @  26.8.2008,  11:08 Найти цитируемый пост)
не срабатывает OnAccept

Уверена, что клиент отсылает второй раз?

Добавлено через 40 секунд
Попробуй динамически создавать TCpServer

Автор: lubja 26.8.2008, 12:40
вот код регистратора, порцедура при нажатии кнопки "отправить":

procedure TFormMain.BtnOkClick(Sender: TObject);
var s: string;
begin
  if TcpClient.Connected then
    begin
      TcpClient.Sendln('SEND|' + LEditKey.Text);
      s := TcpClient.Receiveln();
      if s = '' then
        ShowMessage('Проверьте правильность номера!')
      else
        begin
          LEditRegKey.Text := s;
          TcpClient.Sendln('SUCCESS|' + LEditKey.Text);
          s := TcpClient.Receiveln();
        end
    end
  else
    MessageBox(Handle, 'Сервер не найден!', 'Error', 16);
end;

сколько б я ни пыталась отправить сообщение серверу, TcpClient.Connected всегда True

Автор: lubja 1.9.2008, 10:56
спасибо всем за помощь. все работает! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)